使用Ruby读/写CSV时奇怪的输出字符(汉字)
Wierd output characters (Chinese characters) when using Ruby to read / write CSV
我正在尝试将一组大型 (>500MB) csv 文件的前 5 行打印成较小的 headers 以便更轻松地检查内容。
我正在使用 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
知道发生了什么以及我可以做些什么来简单地停在行尾字符处吗?
正在查看 input/output 十六进制文件(@user1934428 的有用建议)
输入文件 - 每个字符看起来都是两个字节。
输出文件 - 注意每个单字节字符之间的 NULL (00)...
Ruby版本1.9.1
问题是编码不匹配,这是因为在代码的读写部分没有明确指定编码。使用 utf-16le
编码将输入 csv 作为二进制文件 "rb"
读取。以相同的格式写入输出。
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
有用的参考资料:
我正在尝试将一组大型 (>500MB) csv 文件的前 5 行打印成较小的 headers 以便更轻松地检查内容。
我正在使用 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
知道发生了什么以及我可以做些什么来简单地停在行尾字符处吗?
正在查看 input/output 十六进制文件(@user1934428 的有用建议)
输入文件 - 每个字符看起来都是两个字节。
输出文件 - 注意每个单字节字符之间的 NULL (00)...
Ruby版本1.9.1
问题是编码不匹配,这是因为在代码的读写部分没有明确指定编码。使用 utf-16le
编码将输入 csv 作为二进制文件 "rb"
读取。以相同的格式写入输出。
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
有用的参考资料: