2017-08-30 25 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"; '