我有一个csv文件,看起来像这样(还有更多行):
Jim,jim@email.com,8882,456
Bob,bob@email.com,8882,343
我要做的是将第四列456,343
中的所有值更改为500。
我是php的新手,不确定如何做到这一点。 我尝试过
<?php
$file = fopen('myfile.csv', 'r+');
$toBoot = array();
while ($data = fgetcsv($file)) {
echo $data[3];
$data[3] = str_replace($data[3],'500');
array_push($toBoot, $data);
}
//print_r($toBoot);
echo $toBoot[0][3];
fputcsv($file, $toBoot);
fclose($file)
?>
但是可以打印
Jim,jim@email.com,8882,456
Bob,bob@email.com,8882,343
Array,Array
不是
Jim,jim@email.com,8882,500
Bob,bob@email.com,8882,500
我看过这篇文章,PHP replace data only in one column of csv,但它似乎不起作用。
任何帮助表示赞赏。谢谢
答案 0 :(得分:1)
解决问题的一种快速而肮脏的方法是:
foreach (file("old_file.csv") as $line)
{
$new_line = preg_replace('/^(.*),[\d]+/', "$1,500", $line);
file_put_contents("new_file.csv", $new_line, FILE_APPEND);
}
答案 1 :(得分:1)
您可以使用preg_replace并立即替换所有值,而不必循环CSV文件的每一行。
只需要两行代码。
$csv = file_get_contents($path);
file_put_contents($path, preg_replace("/(.*),\d+/", "$1,500", $csv));
$ path是CSV文件的路径。
您可以在此处查看它的运行情况:https://3v4l.org/Mc3Pm
答案 2 :(得分:1)
要更改CSV的一个字段,只需将其分配给该数组元素,则无需使用任何种类的替换功能。
$data[3] = "500";
fputcsv()
用于将一个行写入CSV文件,而不是一次写入整个文件。您需要循环调用它。您还需要返回文件的开头并删除旧内容。
fseek($file, 0);
ftruncate($file, 0);
foreach ($toBoot as $row) {
fputcsv($file, $row);
}