【问题标题】:Ruby CSV fails on fields like ="1234"Ruby CSV 在 ="1234" 等字段上失败
【发布时间】:2014-08-10 18:25:14
【问题描述】:

我需要导入/更新/导出包含以等号开头的字段的 CSV 文件。

...,="20042",...

从网上阅读来看,这是一个强制数字保持为字符串类型的 Excel 技巧(Excel 会看到数字并将其自动格式化为数字)。

Ruby 在这方面失败了:

ruby/1.9.1/csv.rb:1925:in `block (2 levels) in shift': Illegal quoting in line 1. (CSV::MalformedCSVError)

看起来很合理。

处理此问题的最佳方法是什么?预处理文件以删除 =?

这是一个完整的行示例:

"Product Code","Product Name","Retail Price","Tax Percentage","Option Name","Option Type"
="20042","Blossom Wall Art","245.00",="1","",""

【问题讨论】:

  • 您希望数据如何格式化?我会在您的反馈后考虑。 :-)
  • 你能给出至少 2 行吗?这样我就可以试试了..
  • 你能提供一个完整的行,以便我们可以看到引用的真实情况吗?您与 CSV 解析器一起使用的选项也很有用。这可能和Importing CSV quoting error is driving me nuts 一样有问题。
  • 我添加了一个完整的行示例。请注意,两次 2 字段以 = 开头。 CSV 库是否有帮助或在使用 CSV 库之前预解析整个文件的挂钩?

标签: ruby csv


【解决方案1】:

使用gsub 就足够了:

#!/usr/bin/env ruby

require 'csv'

data = File.read('file.csv').gsub(/=("[^"]*")/, '\\1')

CSV.parse(data).each do |e|
  puts e.inspect
end

输出:

["Product Code", "Product Name", "Retail Price", "Tax Percentage", "Option Name", "Option Type"]
["20042", "Blossom Wall Art", "245.00", "1", "", ""]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-09
    • 2023-03-13
    • 2022-07-09
    • 2016-09-19
    • 2021-02-06
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多