
今回は、Excelが出力した特殊な形式のCSVをそれぞれデータとして認識する方法を実験しよう。言語はなんでもいいが、手っ取り早いのでPerlで実験することにしよう。A君、Excelが吐き出すCSVはどのようなものか、おさらいで説明してごらん。
えーと・・・こんな感じですよね?
1.基本的には改行を区切りとして1行が1セットのデータ、カンマで区切られた部分が値である。
2.値の中にカンマ・ダブルコーテーション・改行コードが含まれる場合は、値をダブルコーテーションで囲む。
3.値の中にあるダブルコーテーションは、ダブルコーテーション二つを並べる。
その通り。
まず、一番やっかいなのが、改行じゃ。改行はレコードの区切りの場合とデータとしての改行とが存在するため、1セットのデータをどう取り出すかが重要なんじゃ。どうすればいいと思うかね?
うーん、データのほうの改行は必ずダブルコーテーションで囲まれていると思うけど・・・・
おおっ!Bさん、今日は冴えてるねえ!そこが重要なんじゃ。で、どうやって判断するかだね。
そこなのよねえ。。どうしよう。
そっか!たとえば、CSVデータを1行ずつ取ってきたとき、データの中の改行だとすると、その1行データは必ずダブルコーテーションが奇数含まれていることになるんじゃないかなあ?もしそうだったら、次の行をくっつけてダブルコーテーションが偶数個になるまでくっつければ、正しい1行のデータになるんじゃないかな!
おおっ!A君も今日はすばらしい!その方向でまずは配列に1行ずつのデータを入れるプログラムを作ってごらん。ちなみにダブルコーテーションが含まれている数を数えるなら、tr変換演算子を使うのがいいぞ。
えーと、こんな感じかしら。
$file = 'data.csv';
@result = ();
open(DATA,$file);
while($temp = <DATA>){
while(($temp =~ tr/"//) % 2 == 1){
$temp .= <DATA>;
}
push(@result,$temp);
## 確認
print "------------------------\n";
print $temp;
print "------------------------\n";
}
close(DATA);
おお、よくできたね!
次回はこの続き、フィールド別にデータを取り出して、ダブルコーテーションなどを元に戻して各データをもとのエクセルと同じ状態に戻す部分じゃ。じゃな!
(・・・続く)
(文責:金澤)