LoginSignup
16
15

More than 5 years have passed since last update.

複数のcsvファイルを一つのcsvファイルにマージ

Last updated at Posted at 2014-11-02

明日の11時までにこのcsvファイルをひとまとめにしておいてね

わお徹夜だ☆

ではなく。。。

簡単なスクリプトを組んで一瞬で終わらせてしまいましょう

1.csv
user_id, user_name, mail_address, comment
0001, ホゲほげ男, hogeo@example.com, hogehoge
0002, ホゲほげ子, hogeko@example.com, hogehogehoge
2.csv
user_id, user_name_alphabet, comment2
0001, hoge hogeo, aaaaaa
0002, hoge hogeko, bbbbb

というようなcsvファイルがあったとします。ここでエクセルを使う必要はありません。
以下のようなスクリプトを書けば良いのです

merge.rb
require 'pp'
require 'csv'

class CSVMerger

  def save_csv
    CSV.open("./merged.csv", "wb") do |csv|
      merge_array_from_csv.each do |element|
        csv << element
      end
    end
  end

  def merge_array_from_csv
    list1 = load_csv("1.csv")
    list2 = load_csv("2.csv")

    generated_array = []
    generated_array_element = []

    for i in 0..(list1.count.to_i - 1)
      for j in 0..(list2.count.to_i - 1)
        if (list1[i][0] == list2[j][0])
          generated_array_element.concat(list1[i]).concat(list2[j])
          generated_array << generated_array_element.pop(8).uniq!
        end
      end
    end
    return generated_array
  end

  def load_csv(target_file_name)
    return CSV.parse(open("./" << target_file_name).read)
  end
end

csv_merger = CSVMerger.new()
csv_merger.save_csv

なにをやっているかというと、それぞれのcsvを読み込んで配列とし、
共通要素であるuser_idをもとに、for文で1.csvを上から舐めていき、さらにその中で2.csvを上から舐めて、一致する行の要素をconcatでマージし、uniq!で要素の重複を取り除いています。
冗長な感じになりますが、csvファイルが2個以上の場合でもfor文とif文を修正&追加することで対応できます

エクセル使うのだりいなって思って書いた即興スクリプトなので、イケてない書き方してるかもです

16
15
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
15