我正在尝试替换我正在处理的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
答案 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+")
无效。你必须阅读,处理一行,然后写入一个新文件,然后,当你到达输入文件的底部时,将旧文件交换为旧文件。
在重命名和删除之前,尽可能长时间保留旧文件也很重要。这样,如果代码或主机在处理期间死亡,原始文件就完好无损,只有新文件受到影响。