2009-12-29 85 views
1

我需要使用shift_jis編碼處理文件。然而,行終止符是一種我不熟悉的格式。如何使用CRLF,NEL行結束符處理行?

> file record.CSV 
record.CSV: Non-ISO extended-ASCII text, with CRLF, NEL line terminators 

進出口使用一般:

open my $CSV_FILE, "<:encoding(shift_jis)", $filename or die "Could not open: $CSV_FILE : $!"; 
while (<$CSV_FILE>) { 
    chomp; 
    # do stuff 
} 

然而它仍然留在每個記錄的末端的CR。

什麼是終止這些類型的文件的正確方法?

+0

好奇:這是否意味着文件中的每個記錄都以CR LF NEL結束?或者是一些記錄CR LF和其他NEL? – ZoogieZork 2009-12-29 05:21:39

+2

你確定*有NEL字符嗎? Shift JIS(或ASCII)中不存在該字符。位置0x15處的字符是NAK。 – 2009-12-29 08:06:32

+0

我非常肯定你*不*具有NEL字符,因爲0x85是(在Shift-JIS中)多字節字符序列的一部分。例如。我在這裏得到的一組Shift-JIS文件經常包含這個序列:「\ x8c \ x85」,它實際上代表了這個Kanji:桁。所以你可能只想刪除CR。你可以用一個正則表達式輕鬆完成。 – Giel 2014-02-10 12:39:19

回答

1

爲什麼不手動使用$_ =~ s/\r//

編輯:顯然,你也可以做

require Encode; 
use Unicode::Normalize; 

s/\x{0085}//g; 

刪除NEL: Next Line, U+0085字符。

0

您需要考慮誰在使用數據並瞭解更多關於生成這些文件的環境。如果它是最後一個普通的CSV輸出文件,那麼使用任何你喜歡的舊字符串操作來擺脫它們(並且用它們來生成CRLF終結符),那麼你將會很好。