2011-02-14 104 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()風格的閱讀。