用PHP删除或替换CSV文件的最后一行

时间:2018-10-17 05:47:20

标签: php laravel file csv overwrite

我正在尝试更新一个csv文件的最后一行,我使用以下代码获得了最后一行:

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

我进行了很多搜索,但没有找到任何方法来替换或至少删除csv文件的最后一行,如果不使用foreach循环将非常有用,因为文件很大...

2 个答案:

答案 0 :(得分:0)

<?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();
}?>

答案 1 :(得分:0)

代码:(我没有Laravel可以测试,但是我使用原始PHP进行了测试)

$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

现在,如果要在文件末尾添加新行,则只需将新数据作为逗号分隔的字符串(带有尾随换行符)推入$rows数组中。

如果您有一个包含以下内容的.csv文件:

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

$rows调用之后,array_pop()数组将为:

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
')

*请注意,使用file()时,换行符不会丢失-因此,implode()无需添加任何“胶水”。

调用file_put_contents()之后,文件将被覆盖:

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