2013-07-09 46 views
0

我想替換已包含在我正在處理的tsv文本文件中的一些無效字符。我需要替換文件中的字符。由於文件可能非常大,我正在嘗試逐行處理它們。在Ruby中替換文件中的字符行

我現在所擁有的是覆蓋我的文件並將其留空。我知道我正在做一些錯誤的事情,我只是不確定我應該採取什麼不同的做法。感謝您的任何建議。

begin 
    Dir["#{@data_path}*.tsv"].each do |dir_file| 
     begin 
      File.open(dir_file, "w+") do |file| 
      file.lines.each do |line| 
      line.gsub(/\\t/, " ") 
      line.gsub(/\\/, " ")     
      line.gsub(/\(\"/, "(") 
      line.gsub(/\"\)/, ")") 
      end 
      end 
     rescue Exception => e 
      @log.warn("Unable to replace the bad characters because #{e.message}") 
      next 
     end 
    end  
    rescue 
    nil 
    end 
+0

您缺少重現問題所需的示例數據。 –

回答

2

我會這樣做的邏輯。

Dir["#{ @data_path }*.tsv"].each do |tsv_file| 
    begin 
    File.open(tsv_file + '.new', 'w') do |file_out| 
     File.foreach(tsv_file) do |line_in| 
     file_out.puts line_in.gsub(/[\t\\]/, ' ').gsub('("', '(').gsub('")', ')') 
     end 
    end 
    File.rename(tsv_file, tsv_file + '.old') 
    File.rename(tsv_file + '.new', tsv_file) 
    rescue Exception => e 
    @log.warn("Unable to replace the bad characters because #{ e.message }") 
    end 
end  

請注意,我用/[\t\\]/同時處理兩個標籤和反斜線:因爲我沒有任何樣本數據的工作,但它應該是非常接近它的未經檢驗的。而且,沒有必要屈服於在字符串周圍使用雙引號引起的「傾斜牙籤綜合症」。單引號對清理它們很有用。

您無法讀取和寫入相同的文本文件,因此File.open(dir_file, "w+")不起作用。你必須閱讀,處理一行,然後寫入一個新文件,然後,當你到達輸入文件的底部時,交換舊文件的新文件。

在重命名和可選刪除它之前,儘可能長地保留舊文件也很重要。這樣,如果代碼或主機在處理過程中死亡,則原始文件完好無損,只有新文件受到影響。