1

コンテンツをより簡単に検査するために、一連の大きな (>500MB) csv ファイルの最初の 5 行を小さなヘッダーに出力しようとしています。

これを行うためにRubyコードを使用していますが、次のように各行に余分な漢字が埋め込まれています:

 week_num   type    ID  location    total_qty   A_qty   B_qty   count਍㌀㐀ऀ猀漀爀琀愀戀氀攀ऀ㄀㤀㜀ऀ䐀䔀开伀渀氀礀ऀ㔀㐀㜀㈀ ㌀ऀ㔀㐀㜀㈀ ㌀ऀ ऀ㤀㄀㈀㔀㌀ഀ
 44 small   14  A   907859  907859  0   550360਍㐀㄀ऀ猀漀爀琀愀戀氀攀ऀ㐀㈀㄀ऀ䐀䔀开伀渀氀礀ऀ㌀ ㈀㄀㜀㐀ऀ㌀ ㈀㄀

入力ファイルの最初の数行は次のようになります。

 week_num   type    ID  location    total_qty   A_qty   B_qty   count
 34 small   197 A   547203  547203  0   91253
 44 small   14  A   907859  907859  0   550360
 41 small   421 A   302174  302174  0   18198

奇妙な文字は、データの 1 行目と 3 行目にあるようです。

私のRubyコードは次のとおりです。

num_lines=ARGV[0]  
fh = File.open(file_in,"r")
fw = File.open(file_out,"w")
until (line=fh.gets).nil? or num_lines==0
    fw.puts line if outflag
    num_lines = num_lines-1
end

何が起こっているのか、行末の文字で単に停止するために何ができるのか考えていますか?


入力/出力ファイルを 16 進数で見る(@ user1934428 による有用な提案)

入力ファイル - 各文字は 2 バイトのようです。

ここに画像の説明を入力

出力ファイル - 各 1 バイト文字の間に NULL (00) があることに注意してください...

ここに画像の説明を入力

ルビー バージョン 1.9.1

4

1 に答える 1

1

問題は、コードの読み取り部分と書き込み部分でエンコーディングが明示的に指定されていないために発生しているエンコーディングの不一致です。入力 csvをエンコード"rb"付きのバイナリ ファイルとして読み取ります。utf-16le出力を同じ形式で書き込みます。

num_lines=ARGV[0]  

# ****** Specifying the right encodings  <<<< this is the key
fh = File.open(file_in,"rb:utf-16le")
fw = File.open(file_out,"wb:utf-16le")

until (line=fh.gets).nil? or num_lines==0
    fw.puts line
    num_lines = num_lines-1
end

参考資料:

于 2015-11-10T11:40:08.587 に答える