Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 由于格式错误,Rails导入CSV失败_Ruby On Rails_Ruby_Csv_Ruby On Rails 3.1 - Fatal编程技术网

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文件中读取单个行的方法,用于将整个文件加载到内存中的方法以及不将整个文件读取到内存中的方法,因此,这也应该避免将整个文件加载到内存中,除非您将对
行的引用保存在循环中执行的任何操作中。是的,这里已经确认了
顺便说一句,为什么我不能标记人?