2013-07-02 90 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