2008-10-24 21 views
17

¿Cuál es la mejor manera de sobrescribir una línea específica en un archivo? Básicamente quiero buscar en un archivo la cadena '@parsethis' y sobrescribir el resto de esa línea con otra cosa.Sobrescribir línea en archivo con PHP

Respuesta

18

Si el archivo no es demasiado grande, la mejor manera sería leer el archivo en una matriz de líneas con file(), buscar a través de la matriz de líneas y editar esa línea, luego implode() la matriz volver juntos y fwrite() regresa al archivo.

+1

Esto como siempre lo he hecho. Tendré curiosidad por ver si hay una manera de modificar los archivos in situ. –

+1

Si usa file() para in, después de la implosión probablemente desee file_put_contents() para hacer eso en una sola línea, también. –

-1

Probablemente haga lo que sugirió Jeremy, pero una forma alternativa de hacerlo aquí es otra solución. Esto no ha sido probado o usado y es para sistemas * nix.

$cmd = "grep '@parsethis' " . $filename; 
$output = system($cmd, $result); 
$lines = explode("\n", $result); 
// Read the entire file as a string 
// Do a str_repalce for each item in $lines with "" 
5

Su problema principal es el hecho de que la nueva línea puede no tener la misma longitud que la línea anterior. Si necesita cambiar la longitud de la línea, no hay forma de reescribir al menos todo el archivo después de la línea modificada. La forma más fácil es crear un nuevo archivo modificado y luego moverlo sobre el original. De esta manera, hay un archivo completo disponible en todo momento para los lectores. Use el bloqueo para asegurarse de que solo un script esté modificando el archivo de una vez, y como va a reemplazar el archivo, realice el bloqueo en un archivo diferente. Consulte flock().

Si está seguro de que la nueva línea será la misma longitud que la línea de edad, se puede abrir el archivo en modo de lectura/escritura (uso r+ como segundo argumento a fopen()) y llamar ftell() para guardar la posición del la línea comienza en cada momento antes de llamar al fgets() para leer una línea. Una vez que encuentre la línea que desea sobrescribir, puede usar fseek() para volver al comienzo de la línea y fwrite() los datos nuevos. Una forma de obligar a la línea a tener siempre la misma longitud es espaciando la almohadilla hasta la longitud máxima posible.

20

Si el archivo es realmente grande (archivos de registro o algo así) y está dispuesto a sacrificar velocidad para el consumo de memoria, podría abrir dos archivos y esencialmente hacer el truco Jeremy Ruten propuesto utilizando archivos en lugar de la memoria del sistema.

$source='in.txt'; 
$target='out.txt'; 

// copy operation 
$sh=fopen($source, 'r'); 
$th=fopen($target, 'w'); 
while (!feof($sh)) { 
    $line=fgets($sh); 
    if (strpos($line, '@parsethis')!==false) { 
     $line='new line to be inserted' . PHP_EOL; 
    } 
    fwrite($th, $line); 
} 

fclose($sh); 
fclose($th); 

// delete old source file 
unlink($source); 
// rename target file to source file 
rename($target, $source); 
0

o si el archivo no es demasiado grande:

$sample = file_get_contents('sample'); 
$parsed =preg_replace('#@parsethis.*#', 'REPLACE TO END OF LINE', $sample); 

Vas a tener que elegir delimitadores '#' que no están presentes en el archivo sin embargo.

Cuestiones relacionadas