本章では、初級コマンドで用いた1996年1月のデータを用いて、下図に示すような「商品売上数量ベスト20」の帳票を作成する。
商品売上数量ベスト20チュートリアル初級シナリオ編
|
上図の帳票を作成するにあたり、初級コマンド編で学習したコマンド以外に必要となるコマンドは、「上位20を選ぶ処理」、「順位をつける処理」、「xmlTableをHTMLに変換する処理」の3つである。
まずは、次に示す回答見ずに、各自で、入力データから、上図の帳票を作成するために、コマンドをどのように組み合わせて実行すればよいか(処理の流れ)を考えてもらいたい。
回答:処理の流れ
ただし、この回答は一例であって、順序をかえても同じ結果となる方法もある。また、以下に説明するコマンドは別のコマンドを代用することもできる。これらの点については章末のOnePointを参照してもらいたい。
次に、上記の「処理の流れ」における5,6,8の処理について解説する。
xtbest は、-kで指定したキー項目を単位に(省略時は、キー項目値が全行同じとみなす)、-Rで指定した行番号のレコードを選択する。-Rでは行番号を範囲で指定する。範囲の指定は「開始番号[.]_[.]終了番号」の書式で指定する。以下にいくつかの例をあげておく。
範囲指定 | 意味 |
1_20 | 1以上20以下 |
1._.20 | 1より大きく20より小さい |
5_.10 | 5以上20より小さい |
_15 | 15以下 |
20._ | 20より大きい |
_ | 全て |
またxtbestはxtaccumコマンドと同様に「ソートを意識すべきコマンド」である。レコードの並びによって行番号が異なってくるからである。
上述の処理の流れにおける「上から20行を選択するコマンドは「xtbest -R _20」となる。
順位をつけるためには、番号をつけるコマンド「xtnumber」がある。xtnumberは、-kで指定した項目を単位に(省略時は、キー項目値が全行同じと見なす)、連番をふってくれる。-Sで連番の開始番号を指定し、-Iで連番の間隔を指定する。「-S
10 -I 2」と指定すれば、10から始まる2とびの連番をふる。ただし省略時には「-S
1 -I 1」を指定したものとして動作する。
xtnumberでは同じキー項目値の中で連番をふるが、-Bを指定することによって、同じキー項目値の行は同じ番号を振るように変更することができる。
xtnumberは新しい項目を出力するので-aでその項目名を指定する必要がある。
上述の処理の流れにおける「順位をつける」ために「xtnumber -a 順位」となる。
最後に、xmlTableをHTMLに変換するコマンドxt2htmlコマンドである。このコマンドは、xmlTableの<body>タグの内容、すなわち表をHTMLの<table>タグによる表に変換してくれる。さらに<header>タグの内容の中の、項目名はテーブルの見出し行に、タイトルは表題として、コメントは表題に続く段落として書き出される。
HTMLへの変換は、スクリプトとしても記述できるが、FDの拡張機能として用意もしている。FDの画面から変換したいxmlTableにカーソルを合わせ、"H"を押すと変換できる。その時、HTML変換だけでなく、Excelなどで読み込み可能な形式であるplainTextの形式に変換することもできる。
ここでは、スクリプトに記述するのではなく、FDを使ってHTMLに変換することにする。
以上の説明で、商品売上数量ベスト20を求めるスクリプトを書く準備が整った。以下にその回答を示すが、回答を見る前に各自でチャレンジしてもらいたい。
#/bin/bash #=============================================================== # MUSASHI bash script #=============================================================== #---- タイトル title="商品売上数量ベスト20" #---- コメント comment="チュートリアル初級シナリオ編" #---- 各種変数(適宜修正すること) inPath="/mnt/h00/prm/tutorial" #--------------------------------------------------------------- # コマンド #--------------------------------------------------------------- xtcut -f 商品,数量 -i $inPath/dat.xt.gz | xtagg -k 商品 -f 数量 -c sum | xtjoin -k 商品 -m $inPath/syo.xt -f 商品名 | xtsort -k 数量%n%r | xtbest -R _20 | xtnumber -a 順位 | xtcut -f 順位,商品,商品名,数量 | xtheader -l "$title" -c "$comment" -o syobest.xt #=============================================================== |
このスクリプトを実行すると、以下に示すようなxmlTableによるデータが出力される。
<?xml version="1.0" encoding="euc-jp"?> <xmltbl version="1.00"> <header> <title> 商品売上数量ベスト20 </title> <comment> チュートリアル初級シナリオ編 </comment> <field no="1"> <name>順位</name> </field> <field no="2"> <name>商品</name> <sort priority="2"> </sort> </field> <field no="3"> <name>商品名</name> <sort priority="3"> </sort> </field> <field no="4"> <name>数量</name> <sort priority="1"> </sort> </field> </header> <body><![CDATA[ 1 771279 キリバイ_ハル_キンキラキン 535 2 58335 エリエール_TS_BOX 445 3 120464 エリエール_TP_S 341 4 152781 ニューハンドウォーマー 298 5 843920 チャーミーグリーン_チュウ 289 6 771287 キリバイ_ハル_ミニ_キンキラキン 224 7 311324 ピーチDX_TS_BOX 180 8 379581 スズラン_TP_W_コシソフト 168 9 55336 ゴミブクロ_ペールヨウ_クロ 156 10 1118706 アタック_シンコンパクト 121 11 776190 リポビタン_D 108 12 119466 ネピア_TP_S 107 13 1042921 ハミング_1/3_ツメカエ 100 14 1105311 コウソトップ_ダイ 83 15 42251 デンター_ライオン 81 16 40177 ゴミブクロ_ダイドコロショウ 78 17 42757 ビトイーン_ハブラシ_レギュラ 78 18 30147 イチジクカンチョウ 75 19 159042 キリノスケ_クツシタヨウ_ハルタイフ 73 20 102067 ミズノリ_(ホワイトノール)_PB 72 ]]></body> </xmltbl> |
そして最後に、FD上で、でき上がったsyobest.xtにカーソルを合わせ、"H"でHTML変換を行う。するとsyobest.htmlというファイルが自動的に作成される。
中身の確認は各自でおこなってもらいたい。ただし、FD上からそのファイルを閲覧すると、テキストとしてHTMLを見ることになるので、章の始めに示したような整形された形で閲覧するためには、そのファイルをWWWブラウザーで開かなければならない。
ある帳票を作成するコマンドの組み合わせ方は一種類に決まるわけではない。本章で扱ったスクリプトを例にとると、最初にxtcutしてからxtaggしているが、これは逆にしても結果は同じである。また商品名を結合してから上位20行を選択しているが、この2つを逆にしても結果は同じである。さらに、順位をつけるためにxtnumberコマンドを使ったが、xtcalコマンドでも代用できる。このように、どのような順序でコマンドを実行すればよいか、そしてどのようなコマンドを使えばよいか、の意思決定は、「処理効率」と「スクリプトの分かりやすさ」を基準にすればよい。 例えばxtcutとxtaggの問題については、最初にxtcutを実行することでデータ量を大幅に減らすことができ、それ以降の処理が効率的になる。また商品名の結合を上位20行の選択の後に持っていくことは、処理効率から言えば優れている。なぜならば、商品名の結合をxtbestの前に実行すると、不必要となる商品の名前も全て結合するからである。しかしながら、xtbestの後に商品名を結合すると、レコードの並びが、商品順になってしまう。そのため結合した後に再びxtsortコマンドで数量の多いもの順に並べ返る必要が出てくる。スクリプトの行数が増え「スクリプトが分かりにくくなる」可能性がでてくる。 またxtnumberをxtcalで置き換える問題であるが、xtcalには行番号を出力する「line()」という関数があり、これを使えばxtnumberと同様の処理を実現できる。しかし処理効率の観点からすれば、xtcalよりxtnumberの方が優れている。またxtcalは汎用性の高いコマンドで(何でもできてしまう!!)、逆にxtnumberは「番号付け」に特化してコマンドである。理解のしやすさからすれば後者の方が優れているであろう。 |