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

知道发生了什么以及我可以做些什么来简单地停在行尾字符处吗?


查看十六进制的输入/输出文件(@user1934428 的有用建议)

输入文件 - 每个字符看起来都是两个字节。

在此处输入图像描述

输出文件 - 注意每个单字节字符之间的 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 回答