Estoy tratando de actualizar la última línea de un archivo csv, obtengo la última línea usando este código:

$f = public_path('MYCSV.csv');
$rows = file($f);
$last_row = array_pop($rows);
$data = str_getcsv($last_row);

Busqué mucho pero no encontré ninguna forma de reemplazar o al menos eliminar la última línea del archivo csv, sería genial si no usa foreach loop ya que el tamaño del archivo es grande ...

-2
Designer Developer 17 oct. 2018 a las 08:47

2 respuestas

La mejor respuesta

Código: (no tengo Laravel para probar, pero probé con php sin procesar)

$f = public_path('MYCSV.csv');
$rows = file($f);
array_pop($rows);                       // remove final element/row from $array
file_put_contents($f, implode($rows));  // convert back to string and overwrite file

Ahora, si desea agregar una nueva fila al final de su archivo, solo necesitará insertar los nuevos datos como una cadena separada por comas (con un carácter de nueva línea al final) en la matriz $rows.

Si tiene un archivo .csv con este contenido:

Sally Whittaker,2018,McCarren House,312,3.75
Belinda Jameson,2017,Cushing House,148,3.52
Jeff Smith,2018,Prescott House,17-D,3.20
Sandy Allen,2019,Oliver House,108,3.48

Entonces la matriz $rows, después de la llamada array_pop(), será:

array (
  0 => 'Sally Whittaker,2018,McCarren House,312,3.75
',
  1 => 'Belinda Jameson,2017,Cushing House,148,3.52
',
  2 => 'Jeff Smith,2018,Prescott House,17-D,3.20
')

* Tenga en cuenta que los caracteres de nueva línea no se pierden cuando se usa file(), por lo que no es necesario "pegar" con implode().

Después de llamar a file_put_contents(), el archivo se sobrescribirá con:

Sally Whittaker,2018,McCarren House,312,3.75
Belinda Jameson,2017,Cushing House,148,3.52
Jeff Smith,2018,Prescott House,17-D,3.20
0
mickmackusa 18 oct. 2018 a las 00:31
<?php try {
    $csv_path = 'MYCSV.csv';
    $fp = fopen($csv_path, 'r+');
    if ($fp) {
        $data = array();
        while ($row = fgetcsv($fp)) {
            $data[] = $row;
        }
        fclose($fp);


        array_pop($data);
        $fp = fopen($csv_path, 'w+');
        foreach($data as $key => $value) {
            fputcsv($fp, $value);
        }


    } else {
        throw new Exception("Failed to open file");
    }

} catch (Exception $e) {
    echo $e -> getMessage();
}?>
0
Rubin Porwal 17 oct. 2018 a las 06:27