0

処理中の tsv テキスト ファイルに含まれている無効な文字を置き換えようとしています。ファイル内の文字を置き換える必要があります。ファイルは非常に大きくなる可能性があるため、1 行ずつ処理しようとしています。

現在、ファイルを上書きして空白のままにしています。私はこれでいくつか間違ったことをしていることを知っていますが、どうすればいいのかわかりません。アドバイスをありがとう。

  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 に答える