【问题标题】:Rails Rake Task How to parse CSV with commas in fieldsRails Rake 任务如何在字段中使用逗号解析 CSV
【发布时间】:2015-10-24 10:16:24
【问题描述】:

我有一个 csv,其中包含带逗号的浮点数,除了像“34,21”这样的点,我需要在我的 rake 任务中解析它,我已经尝试了一些这样的解决方案: Ruby on Rails - Import Data from a CSV file

但它们似乎都没有正常工作,它们只是像 2 个字段(32 和 21)一样解析它。 有没有办法使用内置的 CSV 来修复它?

我已经试过了:

task :drugimport, [:filename, :model] => :environment do |task,args|
    CSV.foreach(args[:filename], { encoding: "UTF-8", headers: true, header_converters: :symbol,
        converters: :all}) do |row|
            Moulding.create!(row.to_hash)
        end
end

还有这个:

require 'smarter_csv'
options = {}
SmarterCSV.process('input_file.csv', options} do |chunk|
   chunk.each do |data_hash|
       Moulding.create!( data_hash )
   end
end

它们看起来既漂亮又优雅,除了包含逗号的字段解析错误。

这是我的行,抱歉有俄语,但无论如何:http://pastebin.com/RbC4SVzz 我没有更改任何内容,所以我粘贴到了 pastebin,我猜会比这里更有用

这是我的导入日志: http://pastebin.com/rzC0h9rS

【问题讨论】:

  • 这是一个想法... 取您的 csv 行并用点替换逗号,并在解析后反转更改。 "foo,bar,foo,baz,foo,bar".gsub(",", ".")
  • @TimKos 感谢您的回复,但我想这不是一个合适的解决方案,因为我需要手动检测打开\关闭引号并在其中找到一个逗号然后替换,我想有一个内置解决方案更加优雅和简单,在php中解析此类文件非常容易,我猜rails也有解决方案
  • 在这种情况下,您能否使用用于解析 CSV 文件的代码更新您的答案?虽然我同意您对先前解决方案中缺乏“优雅”的看法,但我认为对于 Rails,某种形式的正则表达式将不可避免地是必要的。不过让我们先看看
  • @TimKos 是的,当然,查看更新
  • 很高兴看到你的 csv 的几行是什么样的。

标签: ruby-on-rails ruby csv rake rake-task


【解决方案1】:

是的,所以据我所见,据您了解,您不会将任何选项传递给解析器。当不指定row_sep 或任何其他形式的选项时,smarter_csv 将使用系统新行分隔符,Windows 机器为"\r\n",Unix 机器为"\r"

话虽如此,请尝试以下...

require 'smarter_csv'
SmarterCSV.process('input_file.csv', :row_sep => :auto, :row_sep => ","} do |chunk|
  chunk.each do |data_hash|
    Moulding.create!( data_hash )
  end
end

我同意 Swards 的观点。我所做的假设了很多事情。浏览一些 CSV 数据可能会很有用。

【讨论】:

  • 是的,你是对的“\r\n”,但它仍然使用“\r\n”作为分隔符:c
  • 嗯,尝试在选项中添加row_sep: :auto。我会相应地更新我的答案供您查看
  • 我已经从 csv 中添加了一些带有标题的行,希望它可以帮助
  • 不,它没有帮助(我添加了数据导入日志,您可以检查数据导入失败的位置,日期和注册号以及带有逗号的价格
  • :0 啊,真是一种解脱!我很高兴一切顺利。
【解决方案2】:

在我看来,你可以走三种可能的道路:

1) 使用“错误”输入并尝试找到解决方法

你可以试着逐行尝试

line.split (" ,")

假设逗号前有一个空格。另一种方法是通过正则表达式识别数值并替换逗号字符(这可能更容易修复源数据!)

2) 尝试使用另一个分隔符导出 CSV

这取决于数据的来源。如果您可以重新导出数据,也许这是最简单的解决方案。当然,在这种情况下,您的数据在技术上将不再是 CSV,而是例如 SSV(分号分隔值)。

3) 尝试其他 CSV 解析器

我绝对可以建议您查看其他 CSV 解析器,例如 fasterCSV 和其他(参见 list of CSV parsers at ruby-toolbox

我希望这是有用的建议 - 示例 CSV 数据肯定会对您有所帮助。

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 2011-11-07
    • 2012-04-13
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多