如何在 ruby​​ 中读取没有 quote_char 的 CSV?

Posted

技术标签:

【中文标题】如何在 ruby​​ 中读取没有 quote_char 的 CSV?【英文标题】:How can I read CSV with no quote_char in ruby? 【发布时间】:2014-06-16 03:32:10 【问题描述】:

我有一个没有引号字符的 TSV 文件。每当数据中出现\t 时,它总是分隔列,而不是列值的一部分。每当出现" 时,它始终是列值的一部分,并且永远不会包含列值。

我想在 Ruby 中阅读这个 CSV,但它给了我

/Users/.rvm/rubies/ruby-1.9.3-p545/lib/ruby/1.9.1/csv.rb:1925:in `block (2 levels) in shift': Illegal quoting in line 9506. (CSV::MalformedCSVError)

我的代码是:

CSV.foreach(input_file,  :col_sep => "\t", :headers => true) do |row|
   puts row
end

有什么办法可以解决这个问题?

【问题讨论】:

我强烈推荐 James Edward Gray II 的 fastcsv gem。它让生活更简单。 Importing CSV quoting error is driving me nuts的可能重复 @6ftDan:Ruby 1.9.3 中的标准库 csv fastercsv AFAIK。 【参考方案1】:

事实证明,我可以通过输入 quote_char => "\x00" 来欺骗它认为零字节是引号字符来修复它。

【讨论】:

【参考方案2】:

liberal_parsing option 可用于此类情况。来自文档:

当设置为真值时,CSV 将尝试解析不符合 RFC 4180 的输入,例如未加引号的字段中的双引号。

在您的示例中,这将是:

CSV.foreach(input_file,  :col_sep => "\t", :headers => true, :liberal_parsing => true ) do |row|
  puts row
end

【讨论】:

以上是关于如何在 ruby​​ 中读取没有 quote_char 的 CSV?的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止在 Ruby 中读取命名管道?

如何在 Ruby 中写入文件?

如何在 Ruby 的 MULTI 块中读取 Redis?

如何使用 Ruby 读取和写入同一个 EXCEL 文件?

Ruby如何打印/放置读取的文件内容而不是一堆数字/符号

使用 Ruby 逐行读取、编辑和写入文本文件