こんにちは、普段は、Ruby でサーバーサイドのバッチ処理を担当している一年目のエンジニアです。
仕事をしていると、ヘッダーが同じ複数のファイルをまとめたいことってたまにあるんですが、(レポートファイルをまとめたり、load_data_infile 用に)その時の書き方をかんがえてみました。
バイナリベースで読み込みを行うので、基本的には、どんな文字コードのファイルでも大丈夫(なはず)です。
僕はCSV や TSV をまとめる処理を行う際にこのメソッドを使っています。
注意点: ヘッダに改行コードが含まれている場合(そんな邪悪なファイルは触りたくない。。。)、このメソッドはうまく働かないです。
加えて、第一引数の file_paths
に対して本来は、nil チェックやら加えたほうがいいですね。
# @param [Array<String>] file_paths 配列でファイルパスを渡します.
# @param [Stiring] to_path 書き出す先のファイルパスを指定します.
def merge_files(file_paths, to_path)
FileUtils.rm(to_path, force: true)
file_paths.each_with_index do |file_path, file_i|
open(file_path, 'rb').each_line.with_index do |row, row_i|
next if file_i.nonzero? && row_i.zero?
open(to_path, 'a') { |f| f << row }
end
end
end