当我尝试使用以下代码导入文件时,我得到CSV:MalFormedCSVError
:
def import_csv(filename, model)
CSV.foreach(filename, :headers => true) do |row|
item = {}
row.to_hash.each_pair do |k,v|
item.merge!({k.downcase => v})
end
model.create!(item)
end
end
csv文件很大,有没有办法可以记录格式错误的行和 CONTINUE EXECUTION 和csv文件的其余部分?
答案 0 :(得分:3)
您可以尝试自己处理文件,让CSV一次在一行上运行。像这样:
File.foreach(filename) do |line|
begin
CSV.parse(line) do |row|
# Do something with row...
end
rescue CSV::MalformedCSVError => e
# complain about line
end
end
当然,你必须自己对标题行做些什么。此外,如果您在CSV中嵌入换行符,则无法使用此功能。
答案 1 :(得分:1)
使用File
手动浏览文件中的每一行的一个问题是CSV文件可以包含其中包含\n
(换行符)的字段。 File
将使用该值来表示换行符,并且您最终会尝试解析部分行。
这是另一种可能适合您的方法:
@csv = CSV.new('path/to/file.csv')
loop do
begin
row = @csv.shift
break unless row
# do stuff
rescue CSV::MalformedCSVError => error
# handle the error
next
end
end
我看到这种方法的主要缺点是,在处理错误时,您无法访问CSV行字符串,只有CSV::MalformedCSVError
本身。