2014年8月7日木曜日

EXCELで困ったときの小技 うまくCSV化できないなら、Rubyを使え

EXCELのシートをCSV化したい場合、EXCEL標準機能でファイル保存でCSV形式にするとセル内改行やカンマが邪魔して、思い通りのCSVファイルにならないことがある。
そんなときには、EXCELの機能を利用することは諦めて、rubyスクリプトを使おう!

rubyがインストールされていれば、以下の3つのステップで簡単にできるよ。
1)ADODBでEXCELファイルをオープン
2)SQLのSELECT文で1行ずつ、読み込む。
3)読み込んだ1行に大して、セル内改行とセル内カンマを除去する

ただし、最初の1行目をフィールド名として使う場合、そのステップが必要となる。














1)ADODBでEXCELファイルをオープン
require ''win32ole'
# Float() ends in no error or error
def Float_String?(str)
  Float(str)
  true
rescue ArgumentError
  false
end
cn = WIN32OLE.new("ADODB.connection")
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.ConnectionString = "Dtata Source=" +  ARGV[0] + ";Extended   Properties=Excel 8.0;"
cn.CursorLocation = 3
cn.Open
2)SQLのSELECT文で1行ずつ、読み込む
sql =  "SELECT + FROM  [" ARGV[1] + "$]"
rs.Open sql
# to get field  name
rec = []
rs.Fields.each do |col|
  text = col.Name
  rec,push(text)
end
puts rec. join(",")
3)読み込んだ1行に大して、セル内改行とセル内カンマを除去する
while !rs.EOF
  rec = []
  rs.Fields.each do |col|
    text = col.Value
    if text != nil and !(float_string?(text))
      text.gsub!(/(¥r¥n|¥r|¥n|,|)/,"")
    end
    rec.push(text)
  end
puts rec. join(",")
rs.MoveNext
end
rs.Close
cn.Close
10年くらい前にrubyを、5年くらい前にはSQLをほんの少しだけ、かじっていたんけど、いろんな「ひとかじり」がつながっていくことは嬉しい。実に、地味だけど。
そして、上記のコードの殆どは、インターネットでゲットできるんだけど、ポイントは、gsubによる「セル内改行とセル内カンマ」の除去。

0 件のコメント:

コメントを投稿