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"