CSV :: MalformedCSVError:新行必须为<“ \ n \ r”>

时间:2019-07-31 01:41:41

标签: ruby-on-rails ruby ruby-on-rails-5.2

尝试使用Ruby CSV解析此文件。

https://www.sec.gov/files/data/broker-dealers/company-information-about-active-broker-dealers/bd070219.txt

但是,我遇到一个错误。

CSV.open(file_name, "r", { :col_sep => "\t", :row_sep => "\n\r" }).each do |row|
    puts row
end
  

CSV :: MalformedCSVError:新行必须在行中<“ \ n \ r”>而不是<“ \ r”>   1。

2 个答案:

答案 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