在Ruby中逐行替换文件中的字符

时间:2013-07-09 18:48:29

标签: ruby

我正在尝试替换我正在处理的tsv文本文件中包含的一些无效字符。我需要替换文件中的字符。因为文件可能非常大,我试图逐行处理它们。

我现在拥有的是覆盖我的文件并将其留空。我知道我做错了一些事情,我只是不确定我应该采取哪些不同的做法。谢谢你的建议。

  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

1 个答案:

答案 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+")无效。你必须阅读,处理一行,然后写入一个新文件,然后,当你到达输入文件的底部时,将旧文件交换为旧文件。

在重命名和删除之前,尽可能长时间保留旧文件也很重要。这样,如果代码或主机在处理期间死亡,原始文件就完好无损,只有新文件受到影响。