Ruby で自家製スクリプトを書く 09
CSV から特定のフィールドのみを出力する
config.yaml
filename: csv: sample.csv sql: sample.sql encoding: output: UTF-8 input: Shift-JIS csv: fs: ', ' quote: '"' headers: false fields: - number: 2 # CSV のフィールドの番号 - number: 3 - number: 4
csv2sql.rb
#!/bin/env ruby $KCODE='utf8' require 'yaml' require 'kconv' require 'rubygems' require 'fastercsv' config_file = 'config.yaml' configs = YAML.load_file(config_file) def convert_char_encoding(encoding, data) begin case encoding when 'jis' return Kconv.tojis(data) when 'Shfit-JIS' return Kconv.tosjis(data) when 'EUC-JP' return Kconv.toeuc(data) when 'UTF-8' return Kconv.toutf8(data) else exit(1) end rescue SystemExit => e p 'set invalid charcter encoding or nil.' exit(0) end end day = Time.now current_time = day.strftime("%Y%m%d_%H%M%S") fp = File.open(current_time + configs['filename']['sql'], 'w+') FasterCSV.foreach(configs['filename']['csv'], {:col_sep => configs['csv']['fs'], :quote_char => configs['csv']['quote'], :headers => configs['csv']['headers']}) do |row| p row #=> 配列の構成 line = [] configs['fields'].each do |filed| # 引き算を行うのは、CSV のデータの配列が「0」で開始されるため。 # 設定ファイルの YAML での記述の可読性を残したかったので、 # ここで配列のインデックス値に合わせている。 number = filed['number'] - 1 if (configs['encoding']['input'] == configs['encoding']['output']) line.push row[number] else line.push convert_char_encoding(configs['encoding']['output'], row[number]) end end fp.puts line.join("\t") + "\n" end fp.close
実行結果。
% ruby csv2sql.rb ["1", "myname", "myaddress", "123-4567"] ["2", "yourname", "youraddress", "890-1234"] ["3", "hisname", "hisaddress", ""] ["4", "hername", "heraddress", "A56-7890"] % ls 20080525_164123sample.sql csv2sql.rb read_yaml.rb config.yaml openfile.rb sample.csv % cat 20080525_164123sample.sql myname myaddress 123-4567 yourname youraddress 890-1234 hisname hisaddress hername heraddress A56-7890