Ruby で自家製スクリプトを書く 08
openfile.rb と read_yaml.rb の機能を合わせる
読み込み元の CSV と出力先の SQL の設定を追加する。
config.yaml
filename: # 保存する CSV のファイル名 csv: sample.csv # 保存する SQL ファイル sql: sample.sql encoding: output: UTF-8 input: Shift-JIS csv: fs: ', ' quote: '"' headers: false
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 FasterCSV.foreach(configs['filename']['csv'], {:col_sep => configs['csv']['fs'], :quote_char => configs['csv']['quote'], :headers => configs['csv']['headers']}) do |row| p row #=> 配列の構成 row.each do |column| if (configs['encoding']['input'] == configs['encoding']['output']) p column #=> 要素の構成 else p convert_char_encoding(configs['encoding']['output'], column) #=> 要素の構成 end end end
実行結果。
% ruby csv2sql.rb ["1", "myname", "myaddress", "123-4567"] "1" "myname" "myaddress" "123-4567" ["2", "yourname", "youraddress", "890-1234"] "2" "yourname" "youraddress" "890-1234" ["3", "hisname", "hisaddress", ""] "3" "hisname" "hisaddress" "" ["4", "hername", "heraddress", "A56-7890"] "4" "hername" "heraddress" "A56-7890"