2011-02-14 103 views
2

我在下面的Perl代码中遇到了一些麻烦。我可以打开并读取手动创建的CSV文件,但如果我尝试打开任何保存为CSV文件的Mac Excel电子表格,则下面的代码将其全部读取为一行。用Perl打开在Mac Excel中创建的CSV文件

#!/usr/bin/perl 

use strict; 
use warnings; 

open F, "file.csv"; 

foreach (<F>) 
{ 
    ($first, $second, undef, undef) = split (',', $_); 
} 

print "$first : $second\n"; 

close(F); 
+0

您是否在OS X或Windows上运行Perl?如果是Windows,文件如何从OS X中移出? – 2011-02-14 13:10:32

回答

10

始终使用一个专门的模块(诸如Text::CSVText::CSV_XS)用于此目的,因为有大量的箱子,其中split -ing不会帮助(例如当该字段包含逗号这不是一个字段分隔符但是在引号内)。

2

不确定Mac的excel,但肯定Windows版本倾向于用引号括起所有值:"like","this"。此外,您需要考虑价值中存在报价的可能性,该报价将显示"like""this"(该值中只有一个")。

但是,要真正回答你的问题,很可能它会使用与你期望的不同的换行符。它可能保存为\r\n而不是\n,反之亦然。

5

传统的Macintosh(系统9和以前的版本)使用CR(0x0D,\ r)作为行分隔符。 Mac OS X(基于Unix)使用LF(0x0A,\ n)作为默认行分隔符,因此作为Unix工具的perl脚本可能期望LF但获得CR。由于文件中没有行分隔符,因此perl认为只有一行。如果它具有Windows行结束符(CR,LF),那么您可能会在每行结尾处看到不可见的CR。

用0x0A代替0x0D的输入快速循环应该可以解决您的问题。

3

我用Excel 2004 for Mac直接遇到了这个问题。行结尾确实是\r和IIRC,文本使用MacRoman字符集,而不像您所期望的那样使用Latin-1或UTF-8。

所以,以及用文字:: CSV /文本:: CSV_XS和分裂的\r了很好的意见,你会想打开使用macroman编码的文件,像这样:

open my $fh, "<:encoding(MacRoman)", $filename 
    or die "Can't read $filename: $!"; 

同样,当读取在Windows上使用Excel导出的文件时,您可能希望在该代码中使用:encoding(cp1252)而不是:encoding(MacRoman)

+0

你为什么要标记这个CW?这是一个非常好的答案。 – DVK 2011-02-15 03:49:33

2

正如其他人所怀疑的,您的行结束可能是责难。在我的基于Linux的系统上有内置的实用程序来改变这些行结束。 mac2unix(我认为只是一个包装dos2unix的包装将会读取你的文件,并为你改变行结尾。你应该在Linux和Mac上有类似的东西(微软可能不会在意你)

如果你想在Perl中处理这个问题,看看如何设置$/变量来设置“输入记录分隔符”从“\ n”到“\ r”(如果这是正确的结尾),请在读取文件之前尝试local $/ = "\r"perldoc perlvar$/附近)或perldoc perlport(致力于编写便携式Perl代码。

PS如果我有这个不正确的一部分让我知道,我不使用Mac,我只是认为我知道理论

0

如果您设置“特殊变量”,它处理它认为换行\ r \一次只能读一行:$/=“\ r”;在这种情况下,perl的mac新行是默认的\ n,但该文件可能使用了\ r。这建立了什么Flynn1179 &马克Thalman说,但告诉你如何使用while()风格的阅读。