問題:我有在Windows和* nix上生成的數據(主要是CSV格式),並且主要在* nix上處理。 Windows使用CRLF作爲行尾,而Unix使用LF。對於任何特定的文件,我不知道它是否有Windows或* nix行結尾。到現在爲止,我已經寫了這樣的事情來處理的區別:在Perl中正確檢測文件的行尾?
while (<$fh>){
tr/\r\n//d;
my @fields = split /,/, $_;
# ...
}
* nix上的\ n部分相當於大嚼,另外擺脫\ r(CR),如果它是一個窗口生成的文件。
但是現在我想Text :: CSV_XS b/c我開始用帶引號的數據,可能帶有嵌入換行符等等得到更多的數據文件。爲了讓這個模塊讀取這些文件,Text :: CSV_XS :: getline()要求你指定行尾字符。 (我不能像上面那樣讀取每一行,tr/\ n \ r // d,並且他們使用不能正確處理嵌入換行符的Text :: CSV b/c來解析它)。我如何正確檢測任意文件是否使用Windows或* nix樣式行結尾,所以我可以告訴Text :: CSV_XS :: eol()如何chomp()?
我無法在CPAN上找到僅檢測行結束的模塊。我不想首先通過dos2unix轉換所有數據文件,b/c文件很大(數百GB),每個文件花費10分鐘以上處理一些如此簡單的事情似乎很愚蠢。我想寫一個讀取文件頭幾百個字節的函數,並計算LF和CRLF的相關性,但我拒絕相信這沒有更好的解決方案。
任何幫助?
注意:所有文件要麼完全是windows-line結尾或* nix結尾,即它們不是混合在一個文件中。
謝謝,我以前從來不知道PerlIO。這正是我需要的。 – user1481