基本帳票編:細分類商品売上ベスト

本章では、基本コマンドで用いた人工データを用いて、下図に示すような「細分類商品売上数量ベスト20」の帳票を作成する。この帳票は、どの細分類商品がよく売れているかをつかむことを目的とする。


出力結果

細分類商品売上数量ベスト20

チュートリアル

順位 細分類 細分類名 数量
1 140323 スポーツドリンク 1233
2 130121 キャンディ・キャラメル 930
3 140325 栄養ドリンク 860
4 110605 インスタント味噌汁・吸物 797
5 110705 冷凍農産素材 757
6 111603 竹輪 757
7 130129 米菓 741
8 111701 漬物 692
9 110209 オリーブ油 659
10 130305 畜産珍味 643
11 140797 酒類を含むセット商品一般 621
12 110119 料理用ワイン 615
13 111605 はんぺん 615
14 130137 生菓子 612
15 140601 清酒 611
16 140211 トマトジュース 603
17 111801 豆腐 588
18 111207 生麺・ゆで麺 578
19 130205 ヨーグルト 571
20 111001 小麦粉 570

処理の流れ

上図の帳票を作成するにあたり、初級コマンド編で学習したコマンド以外に必要となるコマンドは、「上位20を選ぶ処理」、「順位をつける処理」、「XMLtableをHTMLに変換する処理」の3つである。
まずは、次に示す回答見ずに、各自で、入力データから、上図の帳票を作成するために、コマンドをどのように組み合わせて実行すればよいか(処理の流れ)を考えてもらいたい。

回答:処理の流れ

  1. 入力データで必要な項目「商品」「数量」を選ぶ
  2. 商品別に数量を合計する
  3. 商品名を結合する
  4. 数量の多い順に上から20行を選択する
  5. 順位をつける
  6. 項目を「順位」、「商品」、「商品名」、「数量」の順に並べる
  7. HTMLに変換する

ただし、この回答は一例であって、順序をかえても同じ結果となる方法もある。また、以下に説明するコマンドは別のコマンドを代用することもできる。これらの点については章末のOnePointを参照してもらいたい。

次に、上記の「処理の流れ」における4,5,7の処理について解説する。

行番号によって行を選択する(xtbest)

xtbest は、-kで指定したキー項目を単位に(省略時は、キー項目値が全行同じとみなす)、-Rで指定した行番号のレコードを選択する。-Rでは行番号を範囲もしくは行番号のカンマ区切りのリストとして指定する。範囲の指定の例を以下に示しておく。

範囲指定 意味
1_20 1以上20以下
10_MAX 10以上
MIN_10 10以下
1_5,10 1以上5以下および10
2,4,6_10,22 2,4,6以上10以下および22

またxtbestはxtaccumコマンドと同様に「ソートを意識すべきコマンド」である。レコードの並びによって行番号が異なってくるからである。行の並びは"-s"によって指定する。

上述の処理の流れにおける「数量の多いもの順に上から20行を選択するコマンドは「xtbest -s 数量%nr -R 1_20」となる。

行番号項目を加える(xtnumber)

順位をつけるためには、番号をつけるコマンド「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をHTMLに変換するコマンドxt2htmlコマンドである。このコマンドは、XMLtableの<body>タグの内容、すなわち表形式のデータをHTMLの<table>タグによる表に変換してくれる。さらに<header>タグの内容の中の、項目名はテーブルの見出し行に、タイトルは表題として、コメントは表題に続く段落として書き出される。

注)HTMLへの変換は、FDcloneの拡張機能としても用意している。FDcloneの画面から変換したいXMLtableのファイルにカーソルを合わせ、"H"を押すと変換できる。その時、HTML変換だけでなく、一般の表計算ソフトで読み込み可能な形式であるplainTextの形式に変換することもできる。

スクリプト

以上の説明で、商品売上数量ベスト20を求めるスクリプト(xtbest.sh)を書く準備が整った。以下にその回答を示すが、回答を見る前に各自でチャレンジしてもらいたい。

#!/bin/bash
xtcut    -f 細分類,数量 -i /mnt/h00/tutorial/dat.xt |
xtagg    -k 細分類 -f 数量 -c sum |
xtbest   -s 数量%nr -R 1_20 |
xtnumber -a 順位 |
xtjoin   -k 細分類 -m /mnt/h00/tutorial/jicfs6.xt -f 細分類名 |
xtcut    -f 順位,細分類,細分類名,数量 |
xtheader -l "細分類商品売上数量ベスト20" -c "チュートリアル" -o xtbest.xt

xt2html -i xtbest.xt -o xtbest.html

このスクリプトを実行すると、以下に示すようなxmlTableによるデータが出力される。

$ more xtbest.xt
<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.1">
<header>
<title>細分類商品売上数量ベスト20</title>
<comment>チュートリアル</comment>
<field no="1" name="順位"></field>
<field no="2" name="細分類"></field>
<field no="3" name="細分類名"></field>
<field no="4" name="数量" sort="1" numeric="1" reverse="1"></field>
</header>
<body><![CDATA[
1 140323 スポーツドリンク 1233
2 130121 キャンディ・キャラメル 930
3 140325 栄養ドリンク 860
4 110605 インスタント味噌汁・吸物 797
5 110705 冷凍農産素材 757
6 111603 竹輪 757
7 130129 米菓 741
8 111701 漬物 692
9 110209 オリーブ油 659
10 130305 畜産珍味 643
11 140797 酒類を含むセット商品一般 621
--More--(73%)

上記のスクリプトの最後のコマンドにてxtbest.htmlファイルができあがるので、そのファイルをWebブラウザーで閲覧し、内容を確認してもらいたい。

OnePoint 処理順序
 ある帳票を作成するコマンドの組み合わせ方は一種類に決まるわけではない。本章で扱ったスクリプトを例にとると、最初にxtcutしてからxtaggしているが、これは逆にしても結果は同じである。また、順位をつけるためにxtnumberコマンドを使ったが、xtcalコマンドでも代用できる。このように、どのような順序でコマンドを実行すればよいか、そしてどのようなコマンドを使えばよいかの決定は、「処理効率」と「スクリプトの分かりやすさ」を基準にすればよい。
 例えばxtcutとxtaggの問題については、最初にxtcutを実行することでデータ量を大幅に減らすことができ、それ以降の処理が効率的になる。またxtnumberをxtcalで置き換える問題であるが、xtcalには行番号を出力する「line()」という関数があり、これを使えばxtnumberと同様の処理を実現できる。しかし処理効率の観点からすれば、xtcalよりxtnumberの方が優れている。またxtcalは汎用性の高いコマンドで(何でもできてしまう!!)、逆にxtnumberは「番号付け」に特化してコマンドである。理解のしやすさからすれば後者の方が優れているであろう。

練習課題

次のようなデータを作成しよう。スクリプト名及び結果ファイル名は表に示されたものを使おう。

帳票名 スクリプト名 結果ファイル(xt) 結果ファイル(html)
細分類商品売上金額ベスト20 best1.sh best1.xt best1.html
メーカー売上数量ベスト20 best2.sh best2.xt best2.html
細分類商品売上金額ワースト20 best3.sh best3.xt best3.html
細分類商品売上金額ベスト20〜30 best4.sh best4.xt best4.html