« おお振りがかなり良くなってきた! | Main | 恩師にバッタリ »

ExcelのCSV読み込み001問題

散発的なデータ変換やデータ移行はRubyistが最も輝く場面かもしれません。

使い捨てのスクリプトならば「Rubyなんて誰も知らん。一生お前がメンテしろ」と言われることもありませんし、とにかく時間がない場合が多いなかExcelのVBAと格闘している人を横目にRubyのパワーを見せつけることが出来ます。新人の女の子がちまちまデータの手直しをしているところへ救いの手をさしのべた日には「Rubyを使ってモテました」報告ができるぐらいです。まあ、懐かれて酷い目にあっても知りませんが。

特に、cliputilとの合わせ技のコピペワンライナは強力で、セルをコピーして

  cpaste |ruby -pe 'なんかワンライナ' |ccp

を実行してまたExcelに貼り付けると、いちいちマクロを書いているのすらアホらしくなる便利さです。テストデータの作成なんかの時には、欠かせないテクニックです。規模が大きくなってきたら require 'win32ole'もありますし。

というわけで、今日はとあるプロジェクトの移行データ作成を手伝ってました。Excelに入っている元データをテキストにして、ちょちょいとしたスクリプトで変更をかけて、またExcelに読み込みます。

Rubyで読ませる場合には意外に仕様がめんどくさいCSVより、タブ区切りの方が便利。何も考えなくても手が

while line = gets
  data = line.chop.split("\t")

と書き始めてしまうぐらいです。ちょっちょーいと・・・あれ?

あ、改行が入ってるセルがある・・・だみだ・・・しょうがない、CVSにするしかない。Rubyスクリプトの方も行単位の処理じゃだめだから、これはCSVモジュールの出番かな・・・使ったことないんだけど。どれどれ・・・

require 'csv'

csv = CSV::Writer.create(open(ARGV[1],"w"))

CSV.foreach(ARGV[0]) do |data|
  #ここでdataに対して処理をして・・・

  csv << data
end

csv.close

こんな感じで使うみたい。CSV::Writer#createにIOオブジェクトを渡さなきゃいけないらしいことと、dataはArrayが入るんだけど、空のセルに相当する要素には""じゃなくてnilが入ってくることに気がつかなくてちょっと手間取っりましたが、さくさくと。

出来上がったCSVファイルをExcelに読み込ませて、確認。あれれ?"0538"という処理IDが"538という数字になっちゃってます。もー。Excel君はだからキライよ。依頼元の後輩の○9君に相談。

「ああ、それは拡張子を.txtに変換して、Excelにテキスト形式だと思わせてから読み込みの時にデータ形式を文字列に指定すればいいんですよ」

ほっほう、なるほどね。やってみた・・・ら、今度はせっかく" "で囲まれてた改行を理解しなくなって、1レコードが複数行になってしまったぞ。

さて、困った。もちろん、こういう時には解析機関Gの出番である。「VBA 大文字 変換」でググったら、引っかかったのが、このページ

CSV 形式ファイルを Excel で開く際の "001" 問題を回避する方法

○9が教えてくれた方法も含めて、正攻法、裏技等いろんな方法が載ってます。素晴らしい。そこに、「データの先頭にタブ記号(Chr$(9))を付加して CSV に出力すると、Windows XP 上の Excel で開いたときにのみ、文字列として認識されます。」とあります。

なんてバッド!まさにBK(Bad Know-How)!!

しかし、こりゃいいや(笑)

というわけで、ループの前の方に

data.map! do |a|
  "\t" + a if a
end

を突っ込んで無事に出来ました。うーん、ばっどだ

|
|

« おお振りがかなり良くなってきた! | Main | 恩師にバッタリ »

パソコン・インターネット」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/47905/16739762

Listed below are links to weblogs that reference ExcelのCSV読み込み001問題:

« おお振りがかなり良くなってきた! | Main | 恩師にバッタリ »