在ruby中解析CSV字符串

在ruby中解析CSV字符串,ruby,parsing,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::格式错误D

我有以下字符串-它不是完全用逗号分隔的,但与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::格式错误DCSVERROR:不带引号的字段不允许\r\n

你知道为什么会这样吗


我还试着做了一个
response.gsub!(“\t”和“)
查看这是否是问题所在,但似乎没有帮助。

我通过使用以下工具实现了此功能:

输出:

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

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

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

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

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
保留下来,以便解析器将其解释为新行。

我刚刚注意到,文档中提到
:auto
行sep
的支持值,而不是
列sep
。因为它拾取了这个空白,所以它保持在那里,而您得到这个错误是因为字段没有被引用。很抱歉,它是向后键入的,但仍然得到相同的错误。我想这是因为您交换了
行sep
列sep
,而没有交换
响应中的code>和空格字符
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"], [], []]