この章では、データ項目を切り出すコマンドxtcutについて学習する。
注)MUSASHIはデータを加工するための多様なコマンドを提供する。それらのコマンドは、UNIXの標準コマンドと同様に、シェルのコマンドプロンプトから直接実行することができる。しかしながら、ここでは、たとえ数回コマンドを実行するだけであっても、コマンドプロンプトから直接起動するのではなく、シェルスクリプトとして記述し、それを後で実行するという形式をとる。
販売データには多くの項目が含まれている。ここでは、まず「日付」、「数量」、「金額」の三項目を切り出す(選択する)処理を考える。項目の選択にはxtcutコマンドを用いる。
"-i"に入力データファイル名を、"-o"に出力データファイル名を、そして"-f"で選択したい項目名を指定する。
スクリプト(ファイル名は"xtcut.sh"とする)は次のようになる。テキストエディタ(viなど)で、以下のような一行を書こう(一行目は決り文句として"#!/bin/bash"と入力しておこう)。
#!/bin/bash xtcut -f 日付,数量,金額 -i /mnt/h00/tutorial/dat.xt -o xtcut.xt |
"bash xtcut.sh"と入力して実行してみよう。処理が終れば完了メッセージが表示されるはずである(下図参照)。
もし、いくら待ってもそのようなメッセージが出てこなければ何か間違っている可能性がある。"Ctrl+c"で強制的に終了し、再度スクリプトを編集する。
$ bash xtcut.sh #END# 18031 2003/07/31 18:23:37 "xtcut -f 日付,数量,金額 -i /mnt/h00/tutorial/da t.xt -o xtcut.xt" in=38733 out=38733 $ |
終了メッセージが#ERROR#で始まる終了メッセージが出力された場合は、何らかの不具合があることを意味する。例えば下の例では「日付」と書くべきところを「日」と書いてしまったために、「そのような項目名はない」というエラーメッセージが表示されている。
$ bash xtcut.sh #ERROR# 18032 "xtcut -f 日,数量,金額 -i /mnt/h00/tutorial/dat.xt -o xxham" "fiel d name not found : [日]" $ |
無事完了すれば、新しく"xtcut.xt"というファイルができているはずである。
内容を確認すれば、下図のように、日付、数量、金額の三つの項目が選択されているのが確認できるであろう。
$ more xtcut.xt <?xml version="1.0" encoding="euc-jp"?> <xmltbl version="1.1"> <header> <title>顧客購買履歴データ</title> <comment> 人工データ </comment> <field no="1" name="日付"></field> <field no="2" name="数量"></field> <field no="3" name="金額"></field> </header> <body><![CDATA[ 20020101 1 271 20020101 1 459 20020101 1 341 20020101 1 420 20020101 1 420 20020101 1 396 20020101 1 609 20020101 4 1636 20020101 1 356 20020101 4 1248 --More--(0%) |
次に、xtheaderについて学習しよう。
上図に示されたデータを見てもわかるように、タイトルとコメントは、入力データである"/mnt/h00/tutorial/dat.xt"のものがそのまま使われている。xtheaderを使うことによって、このタイトルとコメントを変更することができる。
そこで再度xtcut.shを編集する。
まず、xtcutの行の"-o xtcut.xt"を削除し、行末にパイプ(縦棒"|")を入れておく。そして、xtheaderコマンドを次の行に入力する。このことにより、xtcutで処理した結果をパイプラインを通して次の行のコマンド(xtheader)に送り込むことができる。
xtheaderはデータの<title>、<comment>、<field>タグを変更するためのコマンドである。
xtheaderでは"-l"にタイトル、"-c"にコメントを指定する。
そして最後に、処理結果をxtcut.xtに書き込むように"-o"パラメータを記述しておく。
これらの変更を反映させたスクリプトを下図に示しておく。
#!/bin/bash xtcut -f 日付,数量,金額 -i /mnt/h00/tutorial/dat.xt | xtheader -l "チュートリアル" -c "xtcut" -o xtcut.xt |
このスクリプトを保存し、実行する。タイトルとコメントが変更されていることが確認できるであろう(下図参照)。
$ more xtcut.xt <?xml version="1.0" encoding="euc-jp"?> <xmltbl version="1.1"> <header> <title>チュートリアル</title> <comment>xtcut</comment> <field no="1" name="日付"></field> <field no="2" name="数量"></field> <field no="3" name="金額"></field> </header> <body><![CDATA[ 20020101 1 271 20020101 1 459 20020101 1 341 20020101 1 420 20020101 1 420 20020101 1 396 20020101 1 609 20020101 4 1636 20020101 1 356 20020101 4 1248 20020101 1 436 20020101 1 364 --More--(0%) |
このようにタイトルとコメントを結果のデータに入力することによって、後でデータを閲覧したときに、何のデータかを確認することができる。xtheaderなしにデータを書き出すことも可能であるが、後で何のデータか分からなくなることを防ぐために、必ずタイトルとコメントは入れるようにしておこう。 |
MUSASHIでは全てのコマンドにおいて、実行時に処理内容に関するメッセージを書き出す。スクリプトを実行すると画面上に"#"で始まるメッセージが表示されるのを見たであろう。どのコマンドがいつ終了したか、どのようなオプションが指定されたか、どのファイルから読み込んだか、どのファイルに書き込んだか、どのようなエラーが生じたか(最重要!!)といった情報が出力される。さらにFDcloneにてスクリプトを”X"で実行すると、メッセージを画面に出力するのと同時に、カレントディレクトリの「log」というファイルにも画面と同じ内容のメッセージを書き出す。FDでは"x"(小文字)でもスクリプトを実行できるが、"X"で実行する時との大きな違いは、この「log」ファイルを吐き出すかどうかである。 もし結果データが思い通りのものでなければ「log」ファイルをチェックすれば何か解決の糸口になるかもしれない。 |
MUSASHIでは、各コマンドが処理するデータを、そのコマンドにどのように入出力するかについて、2つの方法がある。一つは、上記の説明にも書いたように、-iと-oを使う方法である。その他にも、標準入出力からもデータを入出力することができる。例えば、「xtcut
-f 日付 -i input.xt -o output.xt」というコマンドは、「xtcut -f 日付 <input.xt
>output.xt」としても、結果は全く同じである。 ただし、-iと-oを使うと、logファイルにどのファイルを入力データ(出力データ)としたかが記録される。標準入出力を使うと、logファイルには記録されない。 |
ファイル名の接尾語(例えば ".xt"や".sh")は、必ずしもつけなければならないというルールはない。後から、ファイル名を見て、何のためのファイルであるかをユーザが識別しやすいくするために、慣例的に付けているものである。 スクリプトに".sh"という接尾語をつけなくても、全く問題なく動作する。またXMLtableのデータについて".xt"を付けなくても、MUSASHIの各コマンドは全く問題なくXMLtableとして認識してくれる。 |
次のようなデータを作成しよう。スクリプト名及び結果ファイル名は表に示されたものを使おう。
帳票名 | スクリプト名 | 結果ファイル(xt) | 結果ファイル(html) | |
メーカー、ブランド、粗利金額を抜き出す | xtcut1.sh | xtcut1.xt (ファイルサイズが大きいので省略)) | ファイルサイズが大きいので省略 | |
顧客、レシートを抜き出す | xtcut2.sh | xtcut2.xt (ファイルサイズが大きいので省略) |
元のデータから、様々な項目を抜き出してみよう。