Sobrescribir Línea en el Archivo con PHP

¿Cuál es la mejor manera para sobrescribir una línea específica en un archivo? Yo, básicamente, queremos buscar un archivo para la cadena ‘@parsethis’ y sobrescribir el resto de la línea con otra cosa.

InformationsquelleAutor Wilco | 2008-10-24

7 Kommentare

  1. 18

    Si el archivo no es demasiado grande, la mejor manera sería leer el archivo en una matriz de líneas con (archivo), búsqueda a través de la matriz de líneas para su cadena y modifique la línea, a continuación, implode() la matriz de nuevo juntos y fwrite() de nuevo al archivo.

    • Este como siempre he hecho. Voy a ser curioso, a ver si hay una manera de modificar los archivos en el lugar.
    • Si utiliza el archivo() en, después de la implosión de la probablemente usted desea file_put_contents() para hacer que en una sola línea, también.
  2. 20

    Si el archivo es muy grande (archivos de registro o algo así) y que están dispuestos a sacrificar la velocidad para el consumo de memoria se puede abrir dos archivos y, esencialmente, hacer el truco Jeremy Ruten propuesto por el uso de 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);
  3. 5

    Su principal problema es el hecho de que la nueva línea no puede ser de la misma longitud que la línea antigua. Si usted necesita para cambiar la longitud de la línea, no hay manera de salir de la reescritura de, al menos, todos los archivos después de cambiar la línea. La forma más fácil es crear un nuevo archivo modificado y, a continuación, mueva sobre el original. De esta manera hay un archivo completo disponible en todo momento para los lectores. El uso de bloqueo para asegurarse de que sólo una secuencia de comandos es modificar el archivo de una vez, y ya que se va a reemplazar el archivo, hacer el bloqueo en un archivo diferente. Echa un vistazo flock().

    Si está seguro de que la nueva línea será la misma longitud que la vieja línea, usted puede abrir el archivo en modo de lectura/escritura (uso r+ como segundo argumento para fopen()) y llame a ftell() para guardar la posición de la línea empieza en cada momento antes de llamar fgets() para leer una línea. Una vez que encuentre la línea que desea sobrescribir, puede utilizar fseek() para volver al principio de la línea y fwrite() los nuevos datos. Una forma de forzar la línea de siempre la misma longitud, es el espacio de la almohadilla a la máxima longitud posible.

  4. 0

    o si el archivo no es demasiado grande:

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

    Tendrás que elegir delimitadores ‘#’ que no están presentes en el archivo, aunque.

  5. 0

    Esta es una solución que funciona para la reescritura de sólo una línea de un archivo en lugar de con sed de PHP. Mi archivo contiene sólo el estilo de vars y que tiene el formato:
    $styleVarName: styleVarProperty;\n

    Para esto primero hay que añadir «:» a los fines de myStyleVarName, y sed reemplaza el resto de la línea con la nueva propiedad y añade un punto y coma.
    Asegúrese de que los personajes están correctamente escapó en myStyleVarProp.

    $command = "pathToShellScript folder1Name folder2Name myStyleVarName myStyleVarProp";
    shell_exec($command);
    
    /* shellScript */
    #!/bin/bash
    file=/var/www/vhosts/mydomain.com/$1/$2/scss/_variables.scss
    str=$3"$4"
    sed -i "s/^$3.*/$str;/" $file
  6. 0

    Si quieres reemplazar completamente el contenido de un archivo con el contenido de otro archivo que se puede utilizar este:

    rename("./some_path/data.txt", "./some_path/data_backup.txt");
    rename("./some_path/new_data.txt", "./some_path/data.txt");

    Así en la primera linea de copia de seguridad el archivo y en la segunda línea de reemplazar el archivo con el contenido de un archivo nuevo.

    Como lo que puedo decir que el cambio de nombre devuelve un valor booleano. True si el cambio de nombre es un éxito y false si se produce un error. Uno podría, por lo tanto, sólo ejecutar el segundo paso, si el primer paso es correcto para evitar que se sobrescriba el archivo a menos que una copia de seguridad se ha realizado correctamente. Salida:

    https://www.php.net/manual/en/function.rename.php

    La esperanza de que sea útil para alguien.

    Saludos

    Adrian

  7. -1

    Me gustaría más probable es hacer lo que Jeremy sugerido, pero sólo para una forma alternativa de hacerlo, aquí hay 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 ""

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea