【问题标题】:Parsing CSV string in ruby在 ruby​​ 中解析 CSV 字符串
【发布时间】:2014-12-20 07:11:22
【问题描述】:

我有以下字符串 - 它不是完全用逗号分隔,但与 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。因为它正在拾取这个空白,所以它会停留在那里,并且您会收到这个错误,因为这些字段没有被引用。
  • 抱歉打错了,还是出现同样的错误
  • 我认为这是因为您交换了row_sepcol_sep 而没有交换;response 中的空白字符。

标签: ruby parsing


【解决方案1】:

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

【讨论】:

    【解决方案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 以便解析器将其解释为新行。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-21
        • 1970-01-01
        • 2014-09-17
        • 2021-01-08
        • 1970-01-01
        • 2012-07-21
        • 2017-01-27
        相关资源
        最近更新 更多