テキストデータの変換と保存 99/8/8(Sun) 10:54am

 文字列を加工する方法とさらには加工したテキストの保存方法について 見てみましょう。

 フィールドセパレータ(AWKで言えばFS、Field Separator)、例えばタブとか空 白とか";"等で区切られたテキストデータをtableタグを付加したHTMLテキストに 変換して、WWWブラウザで表として表示できるようにしてみましょう。

 元になるテキストデータには次のようなスケジュールデータを使います。

-----^ schedule.txt
1999/08/08,13:00,家族でドライブ
1999/08/13,9:00,ログハウスでバーベキュー
1999/08/14,18:30,高校同窓会
-----$ schedule.txt

 これに単純なtableタグを付けてみましょう。無論、HTMLテキストとして表示 できるようにするためにそれ以外のタグも付け加えます。

-----^ schedule.html
<HTML>
<BODY>
<TABLE BORDER=7>
<CAPTION ALIGN=top><B>スケジュール</CAPTION>
<TH>日付</TH><TH>時刻</TH><TH>内容</TH>
<TR>
<TD>1999/08/08</TD><TD>13:00</TD><TD>家族でドライブ</TD>
</TR>
<TR>
<TD>1999/08/13</TD><TD>9:00</TD><TD>ログハウスでバーベキュー</TD>
</TR>
<TR>
<TD>1999/08/14</TD><TD>18:30</TD><TD>高校同窓会</TD>
</TR>
</TABLE>
</BODY>
</HTML>
-----$ schedule.html

 元のテキストデータschedule.txtは各々のデータがフィールドセパレータ"," で区切られています。さらに言えばフィールドの一塊、日付と時刻、内容が改行 で区切られたレコードとなっています。これはCSV形式と言われるものです。こ れをschedule.htmlのようなテキストに変換します。

 さて、ようやくPerlの登場です。schedule.txtを一行ずつ(1レコードずつ)読 みこんで処理します。schedule.htmlの中のテキストデータに対応した規則的な 部分は、

<TR> <TD>フィールド1</TD><TD>フィールド2</TD><TD>フィールド3</TD> </TR>
の繰り返しです。まずこの部分を作ってみましょう。

while(<>){
    chop;
    @fd = split(/,/);
    print "<TR>\n<TD>$fd[0]</TD><TD>$fd[1]</TD><TD>$fd[2]</TD>\n</TR>\n";
}

 while文中の1行目のchopは行末の改行を切り取ります。

 2行目の@fdは配列、標準入力(<>)から改行で区切られた1行を受け取り、split 関数で","で区切ったフィールドデータを配列に入力します。こういった複雑な 作業も一行で表現できるのですから、Perlは大変便利なのです。while($_ = <>) {...とか、@fd = split(/,/,$_);と書いても良いです。$_は入力操作とパターン マッチのデフォルトとなる変数を表しますが、この場合は省略することができま す。

 次の行のprint文は配列で受け取ったフィールドデータに規則的にtableタグを 付加して標準出力に出力します。$fd[0]は@fdの配列の最初の値を表します。 "\n"は改行を表します。""の中では、$fd[0]などの変数は実際の値に展開されま す。

 もう後は終わったようなものです。HTMLテキストの他の部分を出力するprint 文を前後に付加します。

-----^ schetbl.pl
# schedule.txtの最初の部分をhere documentの手法で出力します。
# EOBの行までがそのまま出力されます。これも便利ですね。
print <<EOB;
<HTML>
<BODY>
<TABLE BORDER=7>
<CAPTION ALIGN=top><B>スケジュール</CAPTION>
<TH>日付</TH><TH>時刻</TH><TH>内容</TH>
EOB
# 規則的なテキストデータから1行ずつ入力変換して出力します。
while(<>){
    chop;
    @fd = split(/,/);
    print
"<TR>\n<TD>$fd[0]</TD><TD>$fd[1]</TD><TD>$fd[2]</TD>\n</TR>\n";
}
# 残りの部分を出力します。
print "</TABLE>\n</BODY>\n</HTML>\n";
-----$ schetbl.pl

 いかがでしたでしょうか。最後にschedule.htmlを出力保存の方法を書いてお きます。試してみてください。DOS窓でスクリプトやテキストデータのあるディ レクトリ(フォルダ)で実行してください。

jperl schetbl.pl schedule.txt > schedule.html

 出来上がったschedule.htmlをクリックすれば・・・

スケジュール
日付時刻内容
1999/08/0813:00家族でドライブ
1999/08/139:00ログハウスでバーベキュー
1999/08/1418:30高校同窓会