CSV::MalformedCSVError: New line must be <"\n\r">
CSV::MalformedCSVError: New line must be <"\n\r">
正在尝试用 Ruby CSV 解析此文件。
但是,我遇到了一个错误。
CSV.open(file_name, "r", { :col_sep => "\t", :row_sep => "\n\r" }).each do |row|
puts row
end
CSV::MalformedCSVError: New line must be <"\n\r"> not <"\r"> in line
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
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"
或者您可以将其视为具有 \t\r\r\n
的 row_sep 并且没有额外的字段。
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"
正在尝试用 Ruby CSV 解析此文件。
但是,我遇到了一个错误。
CSV.open(file_name, "r", { :col_sep => "\t", :row_sep => "\n\r" }).each do |row|
puts row
end
CSV::MalformedCSVError: New line must be <"\n\r"> not <"\r"> in line 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
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"
或者您可以将其视为具有 \t\r\r\n
的 row_sep 并且没有额外的字段。
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"