2017-08-30 23 views
-1

我在OSX埃尔卡皮坦解析的Excel CSV文件,该CSV是herePerl的啜食在Excel csv文件

问题是换行被标记为 '\ X0D'(CR)。

1]我已经能够将文件设置为“X0A”(NL)新行与

$> perl -e 'open(fh, "<coord2.csv") or die("can t open file"); 
    binmode(fh); $/=\10; 
    while ($t=<fh>) { $t =~ s/\x0d/\x0a/g; print "$t"; } print "\n"; ' 

变换,但在此之前,我尝试了其他两路,他们失败了,我想知道,如果由于失败的原因,你有一些例证。

$> cat coord2.csv | perl -e 'undef $/; $t=<>; print "$t \n"; ' 

但在输出我没有看到所有的文件,我看到的只是:

2]我试过了一会儿啜所有文件一次

Prelevacampioni ZARA;45.0640, 11.1943;F ;F 9.954467;F00;F599242;F 

3]我试图也设置$/变量,具有:

$> cat coord2.csv | perl -e '$/="\x0d"; @L=<>; 
         for (@L) { print $_; } print "\n"; ' 

但同样,我看到的只是输出作为在同一点[2]。

我很疑惑,你能解释我在做点错误吗?[2]和[3]?

+1

你的第三示例具有语法错误。报价被打破。在MacOS上以'\ r'结尾的字符是正常的。如果你在同一个mac上运行它,你可以使用'chomp',Perl会做正确的事情。但是,似乎你想要立即阅读整个文件,那么为什么要打扰行结束呢? – simbabque

+0

[1]感谢您的语法修正,但结果是一样的。 [2]关于行结束我不同意你,如果你运行'ls -1 | hexdump -C'你可以看到行结尾被编码为NL而不是CR。 [3]我在'print $ _'之前放置了chomp,现在它可以打印所有行!太棒了,现在我明白发生了什么事。谢谢。 –

回答

0

感谢评论我能够理解例子[2]和[3]中的奇怪行为。我在这里给那些可能会遇到同样问题的人写下解决方案。

问题是,OSX编码的新行符是NL ='\ n'='x0a',并且在CVS文件行末尾用CR ='\ r'='x0d'编码。 Perl正确地读取了行,但是输出被破坏了,因为CR使Perl始终处于同一行。

所以,对于实施例中的校正码[2]和[3]为:

[2] $> cat coord2.csv | perl -e 'undef $/; $t=<>; 
      $t =~ s/\x0d/\x0a/g; print "$t \n"; ' 


[3] $> cat coord2.csv | perl -e '$/="\x0d"; @L=<>; 
      for (@L) { s/\x0d/\x0a/g; print $_; } print "\n"; '