Ruby on rails 由于格式错误,Rails导入CSV失败
当我尝试使用以下代码导入文件时,会收到一个Ruby on rails 由于格式错误,Rails导入CSV失败,ruby-on-rails,ruby,csv,ruby-on-rails-3.1,Ruby On Rails,Ruby,Csv,Ruby On Rails 3.1,当我尝试使用以下代码导入文件时,会收到一个CSV:malformedcsvrorer: 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 m
CSV:malformedcsvrorer
:
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文件很大,所以有没有办法只记录格式错误的行,然后继续执行剩余的csv文件?您可以尝试自己读取文件,让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中嵌入了换行符,这也不起作用。使用
文件手动遍历文件中的每一行的一个问题是,CSV文件中可能包含带有\n
(换行符)的字段<代码>文件
将用它来表示换行符,最后您将尝试解析部分行
以下是另一种可能适合您的方法:
@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::Malformedcsvror
本身 我不能权威地说,但我的理解是,这种方法在字段包含\n
的情况下可能会适得其反,因为文件
会将其视为新行的开始,而内置的CSV库知道如何适当地处理它。也许其他人可以跟这个说话…@多斯泰洛文,对,那可能是个问题。但是,在这种情况下,您不能让CSV
做这项工作,因为所讨论的CSV文件有一些格式不正确的记录,而且似乎半损坏的CSV文件使CSV.foreach
无法工作。我今晚正在处理这个问题,另一种方法即将出现。这个方法将把整个文件加载到内存中,对吗?,任何与foreach有相同行为的替代方法?@buncis已经有一段时间了,但据我回忆,shift
方法是CSV库在引擎盖下从CSV文件中读取单个行的方法,用于将整个文件加载到内存中的方法以及不将整个文件读取到内存中的方法,因此,这也应该避免将整个文件加载到内存中,除非您将对行的引用保存在循环中执行的任何操作中。是的,这里已经确认了顺便说一句,为什么我不能标记人?