【PL/I学習|初心者向け】メインフレーム技術者が教える!TALLY関数で文字列とビットを効率よくカウントする方法

1. 導入:なぜTALLY関数が重要なのか

メインフレームでのバッチ処理において、大量のデータの中から「特定の文字が何個含まれているか」を数える場面は非常に多くあります。例えば、CSV形式のレコードに含まれるカンマの数を数えてフィールド数を検証したり、特定のフラグビットがいくつONになっているかを調べたりする作業です。これらをループ処理で1文字ずつ判定すると非常に非効率ですが、TALLY関数を使えば、ハードウェアレベルで最適化された高速な処理が可能になります。今回は、この強力な組み込み関数について解説します。

2. 基礎知識:TALLY関数とは

TALLY関数は、指定した文字列やビット列の中で、ターゲットとなる値が何回出現するかを数える関数です。現代のプログラミング言語(JavaやPythonなど)における「countMatches」や「count」メソッドに相当します。メインフレーム(PL/Iなど)では、この処理がCPUの専用命令(サーチ命令)を呼び出すように設計されているため、自分でループを組むよりも圧倒的に高速に動作するのが特徴です。

3. 実装と解決策

TALLY関数の基本的な構文は、対象となる文字列と、検索したい文字(またはビット列)を指定するだけです。
文法:結果 = TALLY(対象文字列, 検索対象);
この関数は、対象文字列の中に検索対象が何個含まれているかを整数値で返します。データのバリデーション(桁数や区切り文字の整合性チェック)を行う際に、非常にシンプルに記述できるのがメリットです。

4. サンプルプログラム

以下は、PL/I環境でCSVファイルの行データからカンマの数をカウントし、フィールド数を検証するサンプルコードです。そのままコピーしてロジックの参考にしてください。

/ サンプルコード:CSVのカンマをカウントしてフィールド数を検証する /
DCL CSV_LINE CHAR(80) INIT(‘ID001,NAME,DEPT,202310’);
DCL COMMA_COUNT FIXED BIN(15);
DCL EXPECTED_COUNT FIXED BIN(15) INIT(3); / カンマが3つあれば4項目と判断 /

/ TALLY関数を使用してカンマの数をカウント /
COMMA_COUNT = TALLY(CSV_LINE, ‘,’);

/ カウント結果に基づく判定 /
IF COMMA_COUNT = EXPECTED_COUNT THEN
PUT SKIP LIST(‘データ形式は正常です。カウント数:’ || COMMA_COUNT);
ELSE
PUT SKIP LIST(‘エラー: データ形式が不正です。’);

/ ビットカウントへの応用:フラグ列の中の1の数を数える場合 /
/ BIT_DATAが’1011’であれば、結果は3となる /
DCL BIT_DATA BIT(4) INIT(‘1011’B);
DCL ONE_COUNT FIXED BIN(15);
ONE_COUNT = TALLY(BIT_DATA, ‘1’B);
PUT SKIP LIST(‘ONになっているフラグの数:’ || ONE_COUNT);

5. 応用・注意点

TALLY関数を使用する際、以下の点に注意してください。

検索対象が空の場合: 検索対象に空文字を指定すると、予期せぬ結果やエラーになることがあります。必ず定数または長さのある変数で指定してください。
ビット列の扱い: ビット列を対象にする場合、対象のビット長と検索するビットの長さが一致していないと、正しくカウントされないことがあります。ビットパターンを検索する際は、ターゲットの型定義を厳密に行ってください。
パフォーマンスの罠: 高速とはいえ、非常に長い文字列(数MBを超えるようなデータ)に対して繰り返し実行するとオーバーヘッドが発生します。可能な限り、必要な範囲をSUBSTR関数で切り出してからTALLYを実行するなど、対象範囲を絞り込む工夫をすると、より効率的なメインフレーム運用が可能になります。

コメント

タイトルとURLをコピーしました