Rails Rake 任务如何在字段中用逗号解析 CSV
Rails Rake Task How to parse CSV with commas in fields
我有一个 csv,它包含带逗号的浮点数,除了像“34,21”这样的点,我需要在我的 rake 任务中解析它,我已经尝试过一些这样的解决方案:
Ruby on Rails - Import Data from a CSV file
但是其中 none 似乎没有正常工作,他们只是像 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
在我看来,您可以走三种可能的道路:
1) 使用 "bad" 输入并尝试找到解决方法
您可以尝试逐行工作并尝试
line.split (" ,")
假设逗号前有一个空格 space。另一种方法是通过正则表达式识别数值并替换逗号字符(这可能更容易修复源数据!)
2) 尝试用另一个分隔符导出 CSV
这取决于数据的来源。如果您可以重新导出数据,也许这是最简单的解决方案。当然,在这种情况下,您的数据在技术上不再是 CSV,而是例如 SSV(分号分隔值)。
3) 尝试其他 CSV 解析器
我绝对可以建议您看看其他 CSV 解析器,例如 fasterCSV and others (see a list of CSV parsers at ruby-toolbox)
我希望这是有用的建议 - CSV 数据示例一定会对您有所帮助。
是的,据我所知,据您所知,您没有将任何选项传递给解析器。当不指定 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
我同意斯沃兹的观点。我所做的假设了很多事情。看一眼 CSV 数据可能会有用。
我有一个 csv,它包含带逗号的浮点数,除了像“34,21”这样的点,我需要在我的 rake 任务中解析它,我已经尝试过一些这样的解决方案: Ruby on Rails - Import Data from a CSV file
但是其中 none 似乎没有正常工作,他们只是像 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
在我看来,您可以走三种可能的道路:
1) 使用 "bad" 输入并尝试找到解决方法
您可以尝试逐行工作并尝试
line.split (" ,")
假设逗号前有一个空格 space。另一种方法是通过正则表达式识别数值并替换逗号字符(这可能更容易修复源数据!)
2) 尝试用另一个分隔符导出 CSV
这取决于数据的来源。如果您可以重新导出数据,也许这是最简单的解决方案。当然,在这种情况下,您的数据在技术上不再是 CSV,而是例如 SSV(分号分隔值)。
3) 尝试其他 CSV 解析器
我绝对可以建议您看看其他 CSV 解析器,例如 fasterCSV and others (see a list of CSV parsers at ruby-toolbox)
我希望这是有用的建议 - CSV 数据示例一定会对您有所帮助。
是的,据我所知,据您所知,您没有将任何选项传递给解析器。当不指定 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
我同意斯沃兹的观点。我所做的假设了很多事情。看一眼 CSV 数据可能会有用。