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による「セル内改行とセル内カンマ」の除去。