2

我正在尝试使用此代码解析 csv 文件

if (($handle = fopen($csvFilePath, "r")) !== FALSE) {
        $c=0;
        $string="";
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        if($c>0)
        {
        if(($data[$email]!="") and ($data[$firstname]!="") and ($data[$lastname]!=""))
        {
        $string.='(1,';         
            $string.="'".$data[$email]."',";
            $string.="'".$data[$firstname]."',";
            $string.="'".$data[$lastname]."',";
            $string.="'".Yii::app()->params['clientimporttext']."'";

       $string.='),';
       }
        }
        $c++;
    }
fclose($handle);

}

它适用于 Windows csv。
但是当我从mac创建一个csv并解析它不工作时。(它无法识别行尾),

同样,当我使用 mac 打开相同的 windows csv 并使用相同的代码进行解析时,它不起作用。
但是当我将它保存为 windows csv 时。它再次起作用。
所以实际上 wat 是 mac csv 和 windows csv 之间的区别吗?
这两个的分隔符不同吗?
我应该如何更改代码以使其适用于两者?

4

3 回答 3

13

答案在 PHP 文档注释中:

http://be2.php.net/manual/en/function.fgetcsv.php

注意:如果在读取 Macintosh 计算机上或由 Macintosh 计算机创建的文件时 PHP 不能正确识别行尾,启用auto_detect_line_endings运行时配置选项可能有助于解决问题。

问题在于 Windows 和类 unix 机器(就像你的 mac 一样)上的行尾之间的区别: windows ='\r\n'unix = '\n'

解决方案:在打开文件之前添加这一行:

ini_set('auto_detect_line_endings',TRUE);
于 2013-05-13T13:52:17.627 回答
0

Windows 中的返回字符在\rMac 中,我相信它的\r\n.

于 2013-05-13T13:52:44.420 回答
0

Mac 和 Windows 使用不同的 EOL 字符。在最好的日子里,这会让人感到困惑。以下是它们如何在不同平台上工作的一个很好的解释:http: //peterbenjamin.com/seminars/crossplatform/texteol.html

于 2013-05-13T13:56:05.943 回答