Script para reemplazar texto en un archivo plano

Tengo un archivo plano (delimitado por csv) con 60 valores que deben reemplazarse con 60 valores nuevos diferentes.

Original_Value1 ---> New_Value1
Original_Value2 ---> New_Value2
Original_Value3 ---> New_Value3
Original_Value4 ---> New_Value4

.... a 60.

El archivo tiene más de 200k entradas con los 60 valores que deben cambiarse. ¿Cuál es la forma más eficiente de lograr esto?

preguntado el 12 de junio de 12 a las 19:06

4 Respuestas

Asumiendo

1) las longitudes de los valores antiguos y nuevos pueden diferir

2) no sabe qué líneas contienen los valores que se cambiarán antes de tiempo

recorra el archivo, línea por línea usando fgetcsv(), inspeccione los campos en esa línea, haciendo reemplazos según sea necesario. escribe la línea de nuevo en un archivo diferente usando fputcsv()

Respondido el 12 de junio de 12 a las 19:06

Sí, las longitudes de los valores antiguos y nuevos difieren, sin embargo, hay 1 columna específica que estoy buscando para cambiar los datos. La columna contiene un código que corresponde a una ubicación para una categoría en una implementación de Magento. El ejemplo de valor actual es "001094500" debería convertirse en "\Store\Shoes" ¡Gracias por su respuesta! - sr_1436048

Para ser honesto, mi capacidad técnica es limitada, estoy aprendiendo. Apreciaría si pudieras ayudar a teh n00b. - sr_1436048

Aquí está el código de ejemplo:

$input  = 'input.txt';
$output = 'output.txt';

if ($fpin = fopen($input, 'r')) {
  if ($fpout = fopen($output, 'a')) {
    while ($data = fread($fpin, 1024)) {
      fwrite($fpout, your_replacement_function($data));
    }

    fclose($fpout);
  }

  fclose($fpin);
}

Respondido el 12 de junio de 12 a las 19:06

Echa un vistazo a fgetcsv para leer el archivo línea por línea y agregar código para ver si cada línea contiene la cadena que desea reemplazar.

Después de leer cada línea, haga lo que necesita hacer y escríbalo en un nuevo archivo. Puedes usar fputcsv para escribir CSV. Finalmente elimine el archivo antiguo.

¿Quizás alguien conoce una forma de editar la mitad de un archivo? No creo que sea posible.

Respondido el 12 de junio de 12 a las 19:06

Esencialmente, estoy buscando reemplazar datos en un campo específico basado en valores predeterminados. ¡Gracias por tu respuesta! - sr_1436048

perla Al menos ese sería mi consejo, debería ser capaz de hacerlo en una línea... algo similar a

open( IN, " < filename.csv ");
open( OUT, " > output.csv ");

while (<IN>) { # reads in each line of the file
   $line =~ s/Original_Value1/New_Value1/gi;  # g is for global, i is to ignore case
   $line =~ s/Original_Value2/New_Value2/gi;  # g is for global, i is to ignore case
   $line =~ s/Original_Value3/New_Value3/gi;  # g is for global, i is to ignore case
   # ... continue to your values... probably a better way of doing this from a file, but this is quick and dirty, and should work
   print OUT $line; # prints out $line to the output file.
}
close(IN);
close(OUT);

Eso estaría cerca de todos modos, no he escrito perl en bastante tiempo y probablemente podría optimizarse hasta unos pocos caracteres por alguien bueno en PERL golf... =)

Respondido el 13 de junio de 12 a las 19:06

Acabo de ver que esto podría ser solo para PHP ... si lo es, las otras respuestas serán más útiles ... - ciric297

Puse PHP, PERL es aceptable. Entonces, el script que usa mi ejemplo debería verse así: open( IN, " < filename.csv "); abierto( SALIDA, " > salida.csv "); mientras ( ) { $línea =~ s/Original_Value1/New_Value1/gi; $línea =~ s/Original_Value2/New_Value2/gi; imprimir $línea; $línea =~ s/Original_Value3/New_Value3/gi;$línea =~ s/Original_Value4/New_Value4/gi; } acercarse); close(OUT);¡Gracias por la respuesta! - sr_1436048

Probé este ejemplo y recibí un archivo de salida 0k con solo 1 valor para cambiar. - sr_1436048

bueno, tendrá que enviar al archivo con la línea print OUT $ cada vez que quiera poner algo en el archivo. Además, cada iteración a través del ciclo será una línea en el archivo. intente hacer una línea de impresión $ en el bucle y verá el resultado de lo que está haciendo. Hay una variable incorporada llamada $_ en la que se coloca la línea cada vez. parece que su solución debería funcionar, sin embargo, coloque la línea print OUT $ en la parte inferior del ciclo. - ciric297

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.