表形式のCSVをデータベースに収めるために変換するRubyスクリプト
公開日:
:
プログラミング, 事務職のプログラミング
Rubyは手強いなぁ。「たのしいRuby」も厚みが2.5cmくらいあるし。
しかし、先日、Windows用のRuby環境であるRumixをインストールしたので、仕事用Windowsマシンでも気軽にCSVファイルの処理なんかができるようになって、これは世界が広がるような気がするので記録。
会計データの処理用に6年くらい前に作ったバッチファイルは毎月使い続けてるけど、中身はというとsedとsortとgawkでテンポラリファイルを流して、流して、を繰り返しているような代物。いい加減にRubyに書き換えてみよう。そのうち。でもま、今動いてるから変える必要もないんだけど。
表形式のCSVを変換する
よくあるエクセルの表ですが、データベースには流し込みづらいので変換します。実務としては、基幹システムに旧システムのデータを流し込むために作業しているところ。今度のシステム屋は気がきかないので、いろいろとお膳立てしておかないとならない。
またそのうち書くかもしれないですが、春先に住所から各社運賃を計算するツールを作成したのですが、その時も同様にして、各社運賃表をデータベースに流し込みました。
201407.csv
1 2 3 |
得意先コード,得意先名,1111111,1111112,1111113,1111114 12345678,あいうえ商会,12345678,0,11113443,6789680 12345679,かきくけ商会,2345678,22344,1111343,23434378 |
変換結果
1 2 3 4 5 6 7 8 |
2014, 07, 12345678, あいうえ商会, 1111111, 12345678 2014, 07, 12345678, あいうえ商会, 1111112, 0 2014, 07, 12345678, あいうえ商会, 1111113, 11113443 2014, 07, 12345678, あいうえ商会, 1111114, 6789680 2014, 07, 12345679, かきくけ商会, 1111111, 2345678 2014, 07, 12345679, かきくけ商会, 1111112, 22344 2014, 07, 12345679, かきくけ商会, 1111113, 1111343 2014, 07, 12345679, かきくけ商会, 1111114, 23434378 |
Rubyスクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# -*- encoding: utf-8 -*- # テーブル形式の売上一覧を変換 # 横軸: 種別 縦軸: 得意先 # ファイル名は201407.csv という規則で内容は # 得意先コード, 得意先名, 種別1, 種別2....... # 12345678, あいうえ商会, 111, 112....... # という並び # 最初の行は上記のとおり列名が入っている # 種別1〜には月ごと、種別ごと、得意先ごとの売上金額が入っている require "csv" reader = CSV.open(ARGV[0], "r") # ヘッダー部 列名をheaderに格納 header = reader.take(1)[0] #ファイル名本体部を取得 ym = File.basename(ARGV[0], ".csv") # 各行ループ reader.each_with_index do |row, i| # 得意先名 tokuisaki_cd = row[0] tokuisaki_name = row[1] # 表の横方向ループ row.each_with_index do |kingaku, j| # 1つ目は得意先コード、2つ目は得意先名なので捨てる if j>=2 then # putsで改行付きプリント # to_sで文字列に変更 # 得意先名はデータとしては不要だろうけど可読性のため残しておく # ym[0, 4]は年月ym(例: 201407)の0番目から4文字取得し、年を4桁の文字列に 月も同様 puts ym[0, 4] + ', ' + ym[4, 2] + ', ' + tokuisaki_cd + ', ' + tokuisaki_name + ', ' + header[j].to_s + ', ' + kingaku.to_s end end end |