fopen()返回意外的数组与Mac Excel生成的csv

我遇到了一个有趣的问题。 我用Excel创build了一个CSV文件,并尝试使用fopen()fgetcsv()将文件读入PHP。 出乎意料的是,我的代码返回的数组让我觉得这个文件有一行76字段与5行16(我知道,math是不正确的……稍后解释)。 TextEdit将这个理论消解为每行都用新行来呈现文件。 当我删除TextEdit中的新行,然后为每行重新input换行符时,csv被正确读取。

在删除新行之前,我使用显示隐藏字符function在NetBeans中打开了该文件,netbeans似乎认为它是一个段落。 看来fopen()没有。

我看到一个类似的问题,从PHP str_getcsv数组问题 ,我用第一个例子中提供的代码无济于事。 这看起来像Excel提供了一个新的行字符,大多数其他事情认识到一个新的行,但fopen()不。 这是我的代码和csv文件,以防人们感兴趣。

 $data= array(); $handle = fopen(Yii::app()->basePath ."/csv/test.csv", "rb"); while ( !feof($handle) ) { $data[] = fgetcsv($handle); } echo "<pre>"; die(var_dump($data)); fclose($handle); 

这是csv文件:

 id,first_name,last_name,address_1,address2,city,state,postal,image_path1,image_path2,image_path3,image_path4,image_path5,text_area,template_name,order_date id,first_name,last_name,address_1,address2,city,state,postal,image_path1,image_path2,image_path3,image_path4,image_path5,text_area,template_name,order_date id,first_name,last_name,address_1,address2,city,state,postal,image_path1,image_path2,image_path3,image_path4,image_path5,text_area,template_name,order_date best ever!,,,704 west jefferson,,winterset,ia,50273,,,,,,,dummy, hello!!,,,Welcome,,,,,,,,,,,, 

这是一个链接到Excel表格的屏幕截图: http : //grab.by/r9sg

另外,我刚刚注意到每一行的最后一个字段都有一个新的行,也就是说,第一行结尾的数组值应该是order\nid (我认为…它至less有\ nstring…)。 这似乎很奇怪…我会提供从var_dump …中看到的数组:

 array(1) { [0] => array(76) { [0] => string(2) "id" [1] => string(10) "first_name" [2] => string(9) "last_name" [3] => string(9) "address_1" [4] => string(8) "address2" [5] => string(4) "city" [6] => string(5) "state" [7] => string(6) "postal" [8] => string(11) "image_path1" [9] => string(11) "image_path2" [10] => string(11) "image_path3" [11] => string(11) "image_path4" [12] => string(11) "image_path5" [13] => string(9) "text_area" [14] => string(13) "template_name" [15] => string(13) "order_date id" [16] => string(10) "first_name" [17] => string(9) "last_name" [18] => string(9) "address_1" [19] => string(8) "address2" [20] => string(4) "city" [21] => string(5) "state" [22] => string(6) "postal" [23] => string(11) "image_path1" [24] => string(11) "image_path2" [25] => string(11) "image_path3" [26] => string(11) "image_path4" [27] => string(11) "image_path5" [28] => string(9) "text_area" [29] => string(13) "template_name" [30] => string(13) "order_date id" [31] => string(10) "first_name" [32] => string(9) "last_name" [33] => string(9) "address_1" [34] => string(8) "address2" [35] => string(4) "city" [36] => string(5) "state" [37] => string(6) "postal" [38] => string(11) "image_path1" [39] => string(11) "image_path2" [40] => string(11) "image_path3" [41] => string(11) "image_path4" [42] => string(11) "image_path5" [43] => string(9) "text_area" [44] => string(13) "template_name" [45] => string(21) "order_date best ever!" [46] => string(0) "" [47] => string(0) "" [48] => string(18) "704 west jefferson" [49] => string(0) "" [50] => string(9) "winterset" [51] => string(2) "ia" [52] => string(5) "50273" [53] => string(0) "" [54] => string(0) "" [55] => string(0) "" [56] => string(0) "" [57] => string(0) "" [58] => string(0) "" [59] => string(5) "dummy" [60] => string(8) " hello!!" [61] => string(0) "" [62] => string(0) "" [63] => string(7) "Welcome" [64] => string(0) "" [65] => string(0) "" [66] => string(0) "" [67] => string(0) "" [68] => string(0) "" [69] => string(0) "" [70] => string(0) "" [71] => string(0) "" [72] => string(0) "" [73] => string(0) "" [74] => string(0) "" [75] => string(0) "" } } 

我想我试图解释为什么如果我只是在编辑器(Netbeans,Coda,TextEdit)中删除一个新行,然后重新input代码如预期的那样工作,但是如果我使用文件由excel生成。 思考? 在此先感谢您的帮助。

您正在使用Mac。 在Mac OS的UNIX化之前,CR(ASCII码13)是Mac的换行符。 Post Mac OS X,LF(ASCII码10)是换行符。

Excel显然是像一个Mac OS X的应用程序,并使用CR作为新行,这混淆了在UNIX机器上运行的PHP,它需要LF。

TextEdit可以识别兼容的新行约定,但优先插入LF作为换行符,因为这是UNIX工具所期望的。 这就是为什么删除并重新插入换行符“修复”问题; CRs正在悄悄地被LF取代。

修复您的CSV文件最简单的方法是UNIX命令:

tr'\ 015''\ 012'<foo.csv> new.csv