0

我正在尝试替换我正在处理的 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
4

1 回答 1

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+")无法正常工作。您必须读取、处理一行,然后写入一个新文件,然后,当您到达输入文件的底部时,将新文件交换为旧文件。

在重命名和可选删除之前尽可能长时间地保留旧文件也很重要。这样,如果代码或主机在处理过程中死亡,原始文件是完整的,只有新文件受到影响。

于 2013-07-09T19:04:42.987 回答