尝试使用Ruby CSV解析此文件。
但是,我遇到一个错误。
CSV.open(file_name, "r", { :col_sep => "\t", :row_sep => "\n\r" }).each do |row|
puts row
end
CSV :: MalformedCSVError:新行必须在行中<“ \ n \ r”>而不是<“ \ r”> 1。
答案 0 :(得分:3)
Windows row_sep是"\r\n"
,而不是"\n\r"
。但是,此CSV格式不正确。使用十六进制编辑器查看它时,似乎使用的是"\r\r\n"
。
以制表符分隔。
此外,它没有使用正确的引号,第247行包含600 "B" STREET STE. 2204
,因此您需要关闭引号字符。
quote_char: nil, col_sep: "\t", row_sep: "\r\r\n"
最后有一个额外的标签,每行以\t\r\r\n
结尾。您也可以将其视为使用"\r\n"
的row_sep以及额外的\r
字段。
quote_char: nil, col_sep: "\t", row_sep: "\r\n"
或者您可以将其视为row_sep为\t\r\r\n
并且没有多余的字段。
quote_char: nil, col_sep: "\t", row_sep: "\t\r\r\n"
无论哪种方式,都是一团糟。
我使用hex editor并排地将文件视为文本和原始数据。这让我看到了行尾真正的含义。
87654321 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789abcdef
00000000: 3030 3030 3030 3139 3034 0941 4252 4148 0000001904.ABRAH
00000010: 414d 2053 4543 5552 4954 4945 5320 434f AM SECURITIES CO
00000020: 5250 4f52 4154 494f 4e09 3030 3832 3934 RPORATION.008294
00000030: 3532 0933 3732 3420 3437 5448 2053 5452 52.3724 47TH STR
00000040: 4545 5420 4354 2e20 4e57 0920 0947 4947 EET CT. NW. .GIG
00000050: 2048 4152 424f 5209 5741 0939 3833 3335 HARBOR.WA.98335
00000060: 090d 0d0a 3030 3030 3030 3233 3033 0950 ....0000002303.P
^^^^^^^^^
Hex 09 0d 0d 0a是\t\r\r\n
。
或者,您可以使用p
打印行,所有不可见的字符都会显示出来。
f = File.open(file_name)
p f.readline
"0000001904\tABRAHAM SECURITIES CORPORATION\t00829452\t3724 47TH STREET CT. NW\t \tGIG HARBOR\tWA\t98335\t\r\r\n"
答案 1 :(得分:1)
使用:row_sep => :auto
代替:row_sep => "\n\r"
:
CSV.open(file_name, "r", { :col_sep => "\t", :row_sep => :auto }).each do |row|
puts row
end