我想读取CSV数据文件,将其加载到数组中,编辑它并将其写回文件。我已经能够通过Stackoverflow上的示例完成这一次迭代!谢谢。
问题是当我将新数据写回文件时,我尝试将编辑后的数据写回文件的两种方法都在文件末尾添加换行符。这在第二次加载CSV文件数据时会产生问题。第二次读取导致数组中的空索引在写入文件时导致错误。
示例#1:
foreach($editArray as $row) {
$writeStuff = implode(",", $row);
fwrite($file_handle, $writeStuff);
fwrite($file_handle, "\n");
}
示例#2:
foreach ($editArray as $row) {
fputcsv($file_handle, $row);
}
这是原始的csv数据:
1/1/16,Yes,No 1/2/16,No,Yes
使用上述内容编写时,会使用添加的换行符生成此数据:
1/1/16,Yes,No 1/2/16,No,Yes
这个额外的新行在第二次阅读文件时会产生问题。我在fputcsv()
或implode()
上都收到了错误消息。我相信这是因为我在第一次写入后第二次读取文件时由换行引起的空索引。
我可以在fwrite()
示例#1中的最后implode()
上使用带有条件的for循环,但这看起来很笨拙而不是这样做的方式。
也许有一种完全不同的方式来处理这个问题?
答案 0 :(得分:2)
这是fputcsv
fputcsv()将一行(作为字段数组传递)格式化为CSV并将其写入(以换行符终止)到指定的文件句柄。
由于所有行都被换行终止,因此文件末尾会有一个额外的空行
您应该在第二次读取时应用修复,其中最后一行会产生问题,方法是在处理之前检查该行是否为空。
答案 1 :(得分:1)
如果你想阻止在文件的末尾添加一个新行,你可以用你需要的新行(以及你不需要的地方)构建你的数据集,然后写一次:
$writeStuff = [];
foreach($editArray as $row) {
$writeStuff[] = implode(',', $row);
}
fwrite($file_handle, implode(PHP_EOL, $writeStuff));
另外,我不确定你是如何加载文件的,但你总是可以跳过空行 - 这是一个例子:
$editArray = file('your_filename.csv', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
答案 2 :(得分:0)
根据建议,我在阅读和加载文件时寻找解决方案,而不是在编写文件时。
这些是我提出的解决方案。
第一个选项:
while(! feof($file_handle)) {
$tmp = fgetcsv($file_handle);
if($tmp != NULL) {
$myArray[] = $tmp;
}
}
如果该行为空,则fgetcsv返回NULL。
第二选择。抛弃文件()的fgetcsv()。它会在没有测试的情况下忽略空的换行符。
$data_Array = file($file);
foreach($$data_Array as $key) {
$myArray[] = explode(",", $key);
}
这似乎有效。另外,前面给出的implode()和PHP_EOL示例似乎也有效。我可能会遗漏一些东西,但现在这些都有效。