2010-02-23 26 views
12

我试图通过PHP解析用户上传的CSV文件,但它无法正常工作。不带引号的CSV不能与fgetcsv一起使用

我已经上传了几个格式正确的CSV并且工作正常,但是;我有很多用户试图导入从Excel导出的CSV文件,他们遇到问题。我将这些文件与我的文件进行了比较,并注意到Excel文件都缺少条目的引号。除此之外,它们是相同的。如果我打开它并使用Open Office保存它,但不进行任何更改。所以我很确定它与报价有关。

我的问题是;我如何阅读这些格式不正确的CSV?

更新:原因已找到!

这是特定于Mac版本的Excel。由于某些原因,换行符在Mac上的处理方式不同,因此在使用fgetcsv之前,应该这样做;

ini_set('auto_detect_line_endings',TRUE); 
+0

你能告诉我们你的代码并告诉我们问题是什么吗?无论格式如何,我们都可以使用fgetcsv()而不会造成任何问题。 – jasonbar

+0

感谢这个家伙!救生员 –

回答

22

这是特定于Mac版本的Excel。由于某些原因,换行符在Mac上的处理方式不同,因此在使用fgetcsv之前,应该这样做;

ini_set('auto_detect_line_endings',TRUE); 
+0

谢谢!完美的作品。 – tbradley22

+0

令人F目结舌。真棒。找。 – Stegrex

1

望着manual page of fgetcsv,它的原型是这样的:

array fgetcsv (resource $handle [, int $length 
    [, string $delimiter = ',' [, string $enclosure = '"' 
    [, string $escape = '\\' ]]]]) 

$enclosure(即第4个参数)默认值是一个双引号。

如果您尝试指定不需要任何存储模块,那么为第四个参数指定一个空字符串会怎样?

(当然,这可能会破坏现在正在工作 - 这意味着您必须处理两个不同的情况:带有用双引号括起来的字段的文件以及第一个无法读取的文件案例)

+0

是的,我看到了。但是,正如你所说,它打破了目前的工作。有没有简单的方法来检查它存储在哪种格式并适当地切换行为? –

+0

我想有一些正则表达式可以让你确定一个文件在哪一种格式;另一种解决方案是总是尝试第一个*(最常见的情况下)*解决方案,如果它不起作用,请尝试第二个解决方案。考虑到你的文件中的所有行都可能以相同的方式进行格式化,只做第一行的测试应该足够了 - 这意味着你只会对'fgetcsv'进行1次“无用”调用。 –

+0

我试过了,原来空白的外壳不起作用... –