2013-07-02 51 views
1

我正在尝试处理一些非常大的制表符分隔文件。这个过程是:如何在异常之后继续处理Ruby中的块?

begin 
    Dir["#{@data_path}*.tsv"].each do |file| 
     begin    
      CSV.foreach(file, :col_sep => "\t") do |row| 

      # assign columns to model and save 

      end 
      @log.info("Loaded all files into MySQL database illu.datafeeds") 
     rescue Exception => e 
      @log.warn("Unable to process the data feed: #{file} because #{e.message}") 
      next 
     end 
    end 

然而,当我执行此我得到以下错误:

Unable to process the file: /Users/XXXXX_2013-06-12.tsv because Illegal quoting in line 153. 

的文件是太大了,我去和修复错误行。我希望进程继续循环并处理文件,即使有错误行。

有什么建议吗?

谢谢。

回答

4

只是... rescue nil行导致错误

可以循环之前与记录

即使其记录:

error_log ||= Logger.new("#{Rails.root}/log/my.log") 

的循环,而不是仅仅rescue nil使用内部

rescue error_log.info(row.to_s) 

万一你在fi之前得到错误乐开始解析(.foreach程序之前),你可以在以后打开它作为原始文件,并把它读作CSV - 循环(如提及here

..或只是拯救完整的文件解析过程中

CSV.foreach(file, :col_sep => "\t") do |row| 
    ... 
end rescue error_log.info(row.to_s) 
+0

我没有找到你所建议的方法的成功。如果我改变为救援零,该块仍然失败,我只是没有得到任何错误消息。如果我使用error_log.info(row.to_s),则失败,因为(row.to_s)不在CSV.foreach之外。 – analyticsPierce

+0

我试过了。 开始 Dir [“#{data_path} *。tsv”]。do | file | (文件,:col_sep =>“\ t”)do | row | begin CSV.foreach #做的东西 结束 @ log.info(“装所有文件”) 救援 @ log.info(row.to_s) 结束 结束 结束 – analyticsPierce

+0

其实我得到这个由行错误捕获移动工作在CSV.foreach循环中开始救援块。谢谢。 – analyticsPierce