2013-07-09 3 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+") не будет работать. Вы должны прочитать, обработать строку, затем записать в новый файл, а затем, когда вы достигнете нижней части входного файла, замените новый для старого файла.

Важно также сохранить старый файл как можно дольше, прежде чем переименовывать и, при необходимости, удалить его. Таким образом, если код или хост умирает во время обработки, исходный файл остается нетронутым и затрагивается только новый файл.

Смежные вопросы