在Ruby中解析CSV字符串

15

我有一个字符串 - 它并不完全是逗号分隔的,但具有与csv数据集相同的效果:

response = "Date;Amount;Account;User\n2014-12-01;12.01;abcxyz;user1\n2014-12-01;10.09;fine;user2\n\r\n\t\t\r\n"

我尝试运行以下内容进行解析:
CSV.parse(response, :col_sep => ";", :row_sep => :auto) 

但是我遇到了以下错误:

CSV::MalformedCSVError:未引用的字段不允许 \r 或 \n

有任何想法为什么会出现这种情况吗?

我还尝试过执行 response.gsub!("\t", ""),看看是否有问题,但似乎没有帮助。


我刚刚注意到CSV.new文档中提到了:auto作为row_sep支持的值,但没有提到col_sep。因为它捕捉到这个空格,所以它会一直保留在那里,如果字段没有被引用,就会出现错误。 - Nick McCurdy
抱歉,我输入反了,但是仍然遇到相同的错误。 - locoboy
我认为这是因为您在不交换 response 中的 ; 和空格字符的情况下交换了 row_sepcol_sep. - Nick McCurdy
3个回答

16

我通过使用#strip方法使其工作:

require 'csv'

response = "Date;Amount;Account;User\n2014-12-01;12.01;abcxyz;user1\n2014-12-01;10.09;fine;user2\n\r\n\t\t\r\n"

CSV.parse(response.strip, :col_sep => ';') do |row|
  p row
end

输出:

arup$ ruby a.rb
["Date", "Amount", "Account", "User"]
["2014-12-01", "12.01", "abcxyz", "user1"]
["2014-12-01", "10.09", "fine", "user2"]

它运行良好。 - Astm

6
这将为您提供数组中的每一行。
CSV.parse( response.gsub( /[\r\t]/, '' ), col_sep: ";" )
=> [["Date", "Amount", "Account", "User"], ["2014-12-01", "12.01", "abcxyz", "user1"], ["2014-12-01", "10.09", "fine", "user2"], [], []]

除非你想将所有行合并成一行,否则你需要保留 \n 让解析器将其解释为新的一行。


1
一个简单的解决方法是在解析字符串之前,将任何连续的空白字符替换为单个换行符。然后,您可以使用换行符作为行分隔符,而不是将其设置为:auto。这应该会使CSV解析更快(因为它需要更多时间来猜测您的分隔符:auto),尽管性能也会受到对gsub的额外调用的负面影响。
CSV.parse(response.gsub(/\s+/, "\n"), col_sep: ';', row_sep: "\n")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接