Alfumao escribiste:- Tenemos miles de filas que recorrer
- Cada "$ya_vista" se puede encontrar en cualquiera de ellas
- Necesitamos que los miles de identificadores presentes en la columna 1 se revisen secuencialmente para seleccionar solo las filas sin repeticiones de los valores de la columna 1
- Además la primera vez que aparece dicho identificador en la columna 1, hace que este no pueda volver a aparecer en las siguientes líneas inspeccionadas
- Esto me hace pensar que hay que almacenar las líneas seleccionadas en algún tipo de array que una vez hecho todo el rastreo, podamos imprimir, ya que si imprimimos una línea cada vez, no sé si íbamos a filtrar la tabla correctamente...
A ver... te explico mi solución, a ver si así se ajusta a lo que pedías.
Voy leyendo línea por línea, extrayendo la primera columna, y agregando ese campo al patrón $ya_vista.
Esto tiene el siguiente efecto (adecuando las respuesta a tus cuestiones):
- El archivo se lee una sola vez, así que no importa su tamaño
- Los identificadores se leen una vez y se buscan en cada nueva línea. Si esa línea contiene alguno de los identificadores leídos antes, se salta (pero puede ocurrir un error, leer más abajo)
- Si un identificador se vuelve a repetir en las siguientes líneas, se salta (porque está en el patrón $ya_vista)
- El patrón $ya_vista tiene esta forma:
campo1x|campo1y|campo1z|...|campo1N, que es como un
array, pero en forma de patrón de exp. reg.
Esto realiza el filtrado tal como lo queremos, PERO fallará en el siguiente caso:
Supongamos que la línea X contiene un campo -distinto del primero- llamado 'campoXY'.
Si... más adelante... leemos la línea Y, y resulta que
su primer campo es justamente 'campoXY', la línea X leída antes
no es filtrada (porque entonces no se sabía que existiera una línea Y).
Entonces... si la regla básica es que hay que filtrar todas las líneas para extraer aquellas que contengan
cualquiera de los primeros campos de todas las líneas, no queda más remedio que hacer dos pasadas:
- En la primera pasada, nos hacemos con todos los campos1, y creamos el patrón
- En la segunda pasada, filtramos las líneas que coinciden con el patrón, EXCEPTO si el patrón coincide con el primer campo de la línea. Si la línea no coincide con todo esto, grabamos la línea en el archivo resultado