自作ソフトの紹介
1-2)ソートプログラム、TAB_sort.exe
エクセル2007以降では、行数(約104.8万行)・並べ替えキー数(ユーザの望む数)が、拡張されましたが、それまでは、行数が約6.5万、並べ替えキー数が3でした。それ以上の扱いをする場合には分割するか、RDB(アクセスなど)を使う必要がありました。
自分で処理を行うため、テキストに落としたデータを扱うプログラムを作成しました。CSV・TSVファイルを操作する関数をまとめた「CSVasAPI32b.dll」と、ソートや集計を行う「TAB_sort32.exe」、「TAB_sum32.exe」です。
最初はdll(ダイナミック・リンク・ライブラリ)ではなく、都度、組み込んで個別で作ってきましたが、外出しして、dllにまとめました。また、ソートも集計もデータ毎に個別に開発していましたが、よく使う処理なので、汎用化しました。バグ修正・もれた仕様の追加を行ってきて、実践的なツールになったと思います。
エクセルで、並べ替え・ピボットテーブル・集計処理など使えば、ほぼできますが、処理を繰り返し行う場合や、組み合わせた処理を行う場合など、重宝することもあります。ユニコード対応できていない、ソートできるレコードが20万行以下など、制限がありますが、参考になればと思い、ソースプログラム・exeファイルを公開します。
入力ファイルを読み込み、指定した項目名(フィールド)、(昇・降)順でソートします。ソート項目をメモリにとりこみ、標準関数(qsort)ソートを行うので、行数の制約(20万行)があります、ソート項目も文字列・整数・浮動小数点で計10項目としています。
@使用方法
c:\>tab_sort32 inputfile outputfile su項目 ld整数項目 dd小数項目
A仕様
・TABファイルは1レコード目にフィールド名が入っている
・文字列項目は「”」くくりがあっても無くてもOK、あれば、外して出力する。
(フィールド行を除く)
・引数1はインプットファイル名を指定
・引数2はアウトプットファイル名を指定
・引数3以降はソート項目を優先度の高い順に指定する。
・ソート項目は{s|l|d}{U|D}フィールド名で指定する。
(s:文字列、l:整数、d:浮動小数点、U:昇順、D:降順)
・ソート項目は、10個までとする。
・アウトプットファイルも1行目はフィールド名が入る。
引数からインプットファイルの、アウトプットファイルのチェックし、引数からソート項目の形式、項目を読み込む。
ファイルを読み込み、ソート処理用に、各行の「ファイル内の場所」「キー内容」を保管します。この際、固定的に文字列10件(長さが50文字以内)、整数・浮動小数点項目が各10件で設定しています、全然、洗練されてないやり方です・・・
ソート処理には、標準関数であるクイックソート(qsort)を使っています。関数定義は、以下です。
void qsort(void *base, size_t nmemb, size_t size,
(データ) (件数) (1件のサイズ)
int(*compar)(const void *, const void *));
(判定する関数を指定)
使い方は、多くの方が紹介されているので、そちらを参考にしてほしいです。比較を行うための関数を自分で作って引き渡すのが特徴です。戻り値で判断するので、±1、0が戻るようにします。
比較するためのキーを記録するために構造体を用意し、優先するキー順に、タイプ(文字列、整数、実数)、フィールド番号、昇順・降順を記録します。比較関数では、キーの順に比較してしていって、大・小・イコールの結果を返すようになっています。
qsort()でソートして、並べ替えられるので、1行ずつ取り出して、アウトプットファイルに出力します。
※ソースプログラムと実行プログラムはこちら、コンパイル結果は以下です。

2019年のセ・リーグ打撃30傑を使い、打率順に並んでいるリストを本塁打が多く、三振数の少ない順に並べ替えます。実行結果とデータの並べ替え結果を以下に示します。
<実行結果>

<並べ替え 前・後>


|