解析ruby中的CSV字符串

时间:2014-12-20 07:11:23

标签: ruby parsing

我有以下字符串 - 它不是以逗号分隔,而是与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", "")来查看问题是否存在,但似乎没有帮助。

3 个答案:

答案 0 :(得分:8)

我使用#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"]

答案 1 :(得分:2)

这将为您提供数组中的每一行。

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留给解析器解释为新行。

答案 2 :(得分:1)

解决此问题的一种简单方法是在解析字符串之前用单个换行符替换任何连续的空格字符。然后,您可以使用换行符作为行分隔符,而不是将其设置为:auto。这应该使CSV解析更快(因为:auto需要更多的时间来猜测你的分隔符),尽管从技术上来说,对gsub的额外调用也会对性能产生负面影响。

CSV.parse(response.gsub(/\s+/, "\n"), col_sep: ';', row_sep: "\n")