fgetcsv无法读取以Mac格式编写的CSV文件中的行结束符,有更好的解决方案吗?

65

我正在使用php的fgetcsv函数解析一个csv文件。它可以将一行中的所有内容解析出来,后来我发现,csv文件包含回车符"\r"。我看到这在之前被报告为php的bug。我通过设置php运行时配置来解决了这个问题,配置如下 -

ini_set("auto_detect_line_endings", "1");

还有其他解决方案吗?或者这是正确的方式吗?

谢谢


你应该在这里回答自己的问题,以便关闭该问题。 - Jim Rubenstein
4
为了以后的参考,这必须在调用 fopen 之前完成。我在调用 fopenfgetcsv 之间添加了它以进行测试,但没有起作用。我再也不会浪费那二十分钟了。 :-) - Scott Keck-Warren
@ScottWarren - 我简直不敢相信我直到现在才读到这个。过去的一年里,我一直想不通为什么我的 Store Locator Plus 中的 CSV 导入在 osx 文件上无法正常工作!感谢您的分享! - Lance Cleveland
在 PHP 中,这应默认为“1”,而不是我们试图弄清楚它。 - Ron
2个回答

37

php文档 明确建议设置 auto_detect_line_endings

然而,我无法理解为什么你想在2010年使用 \r 作为行分隔符。如果可能的话,请将它们转换为UNIX风格的 \n


6
我的客户给了我一个包含\r的文件。我问他用的是哪个操作系统版本,他告诉我使用的是Leopard和Office 2008。我正在为他们构建一个插件,将有许多最终用户使用,所以我正试图构建这个跨平台插件。 - Musa
1
在我的情况下,用户使用的是Mac OS(10.9,Maverick)和MS Office Excel 2011。 - marcovtwout
在我的情况下,是在Windows 7上使用Excel 2013。 - JaseC
1
现在已经是2016年了,我仍然会遇到人们上传这种由当前Mac OS上的Excel生成的文件。 - Phil
1
现在已经是2018年了,仍然从客户那里收到带有不可预测行结尾的垃圾CSV文件;auto_detect_line_endings 真是太神奇了! - quickshiftin

5

\r 行尾标记是由 Microsoft Excel 在保存为 CSV 文件时创建的,因此如果您从 Excel 电子表格开始,则没有太多绕过它的方法。

使用 auto_detect_line_endings 可以正常工作,或者您可以使用 preg_replace("/\r\n|\n\r|\n|\r/", "\n", $subject); 规范化行尾标记。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接