【COBOL学習|豆知識】COBOL特殊名段落 ALPHABET句でソート順を自在に操る!

はじめに

COBOLプログラマーの皆さん、こんにちは!今回は、COBOLのプログラムの静的な構造を理解する上で欠かせない、「特殊名段落」の中でも特に「ALPHABET句」に焦点を当てて解説します。
「ALPHABET句」は、文字コード体系の指定や、特定の文字の並び順をカスタマイズするために使用されます。これにより、通常では対応できないような特殊なソート順序を実現したり、多言語環境での文字の扱いに柔軟性を持たせることができます。

ALPHABET句の基礎知識

ALPHABET句は、プログラムのIDENTIFICATION DIVISIONとENVIRONMENT DIVISIONの間に位置するSPECIAL-NAMES段落内で定義されます。
この句を使うことで、プログラム内で使用する文字セットや、文字の並び順を定義することができます。
主な用途は以下の通りです。

  • 文字コード体系の指定: ASCIIやEBCDICといった、コンピュータが文字を表現するために使用するコード体系を指定します。
  • ソート順序のカスタマイズ: 特定の文字をリテラルとして定義し、それらの文字がどのように並べられるかを細かく制御します。これは、例えば、数字の前に特定の記号を配置したい場合などに有効です。
  • 多言語対応: 非ASCII文字や、特定の言語における並び順を考慮する必要がある場合に役立ちます。

ALPHABET句の実装方法

ALPHABET句の基本的な構文は以下のようになります。

SPECIAL-NAMES.
ALPHABET 句名 IS コード体系名.

ここで、「句名」は、このALPHABET句をプログラム内で参照するための任意の名前です。「コード体系名」には、ASCII、EBCDICといった標準的なものや、ユーザー定義の文字セットを指定できます。

さらに、特定の文字の並び順をカスタマイズしたい場合は、以下のような構文を使用します。

SPECIAL-NAMES.
ALPHABET 句名 IS
字句1 FOR文字1
字句2 FOR文字2

字句n FOR文字n.

ここで、「字句」はその文字を表現するリテラル、「文字」は実際にソート順で使われる文字です。例えば、小文字の’a’を大文字の’A’よりも前に来るようにしたい場合などに利用できます。

サンプルプログラム

ここでは、ALPHABET句を使って、小文字を大文字よりも前に来るようにソート順をカスタマイズする例を示します。

IDENTIFICATION DIVISION.
PROGRAM-ID. SORT-CUSTOM.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATA.
05 WS-ITEM OCCURS 5 TIMES.
10 WS-CHAR PIC X.
01 WS-SORT-KEY.
05 WS-SORT-CHARS PIC X(5).

01 OUTPUT-RECORD.
05 OUT-CHAR PIC X.

PROCEDURE DIVISION.
MAIN-PROCEDURE.
MOVE ‘aBcdE’ TO WS-SORT-CHARS.
MOVE WS-SORT-CHARS TO WS-DATA.

DISPLAY ‘— Before Sort —‘.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
DISPLAY WS-ITEM(I)
END-PERFORM.

  • ALPHABET句で定義したカスタムソート順を使用

SORT WS-ITEM ON ASCENDING KEY WS-CHAR
USING INPUT-FILE
GIVING OUTPUT-FILE.

  • (注:実際のファイル処理を伴う場合は、INPUT-FILE/OUTPUT-FILEの定義が必要です。
  • ここでは、ファイル処理を省略し、概念的なソート処理とみなしてください。
  • もし、ファイル処理を伴う場合、以下のような記述が必要になります。)
  • FILE SECTION.
  • INPUT-FILE.
  • RECORD CONTAINS 1 CHARACTERS.
  • DATA RECORD IS INPUT-RECORD.
  • INPUT-RECORD.
  • 01 FILLER PIC X.
  • OUTPUT-FILE.
  • RECORD CONTAINS 1 CHARACTERS.
  • DATA RECORD IS OUTPUT-RECORD.
  • (注:上記ファイル定義は、このサンプルを完全な実行可能にするためのものです。
  • ここでは、ファイル処理を伴わない場合を想定して、ソート処理の概念を説明します。
  • 真にファイル処理を伴う場合は、以下のPROCEDURE DIVISIONを修正する必要があります。)
  • (注:ファイル処理を伴わない場合の簡易的なソート概念の代替処理)
  • 実際には、COBOLのSORT文はファイル入出力と連携しますが、
  • ここでは、簡易的に配列の要素を比較して並べ替えるロジックを模倣します。
  • 実際のSORT文の動作とは異なりますが、ALPHABET句の効果を理解するための一例としてください。
  • (簡易的なソートロジックの模倣 – 実際にはSORT文がこれを実行します)
  • ALPHABET句で定義したカスタムソート順に従って、WS-ITEMを並べ替える処理が
  • SORT文によって行われると想定します。
  • (ここでは、ファイル入出力なしで、メモリ上の配列を並べ替えるための
  • 簡易的な例として、直接DISPLAYでソート結果を表示する形をとります。)
  • ALPHABET句で定義されたカスタムソート順(小文字が先)でソートされたと仮定して
  • 表示します。

DISPLAY ‘— After Custom Sort (a < A) ---'. MOVE 'aBcdE' TO WS-SORT-CHARS.

  • カスタムソート順に従うと、’a’, ‘c’, ‘d’, ‘B’, ‘E’ の順になります。

DISPLAY ‘a’.
DISPLAY ‘c’.
DISPLAY ‘d’.
DISPLAY ‘B’.
DISPLAY ‘E’.

STOP RUN.

SPECIAL-NAMES SECTION (ここにALPHABET句を定義)
SPECIAL-NAMES.
ALPHABET MY-ALPHA-SET IS
‘a’ FOR ‘a’
‘b’ FOR ‘b’
‘c’ FOR ‘c’
‘d’ FOR ‘d’
‘e’ FOR ‘e’
‘f’ FOR ‘f’
‘g’ FOR ‘g’
‘h’ FOR ‘h’
‘i’ FOR ‘i’
‘j’ FOR ‘j’
‘k’ FOR ‘k’
‘l’ FOR ‘l’
‘m’ FOR ‘m’
‘n’ FOR ‘n’
‘o’ FOR ‘o’
‘p’ FOR ‘p’
‘q’ FOR ‘q’
‘r’ FOR ‘r’
‘s’ FOR ‘s’
‘t’ FOR ‘t’
‘u’ FOR ‘u’
‘v’ FOR ‘v’
‘w’ FOR ‘w’
‘x’ FOR ‘x’
‘y’ FOR ‘y’
‘z’ FOR ‘z’
‘A’ FOR ‘A’
‘B’ FOR ‘B’
‘C’ FOR ‘C’
‘D’ FOR ‘D’
‘E’ FOR ‘E’
‘F’ FOR ‘F’
‘G’ FOR ‘G’
‘H’ FOR ‘H’
‘I’ FOR ‘I’
‘J’ FOR ‘J’
‘K’ FOR ‘K’
‘L’ FOR ‘L’
‘M’ FOR ‘M’
‘N’ FOR ‘N’
‘O’ FOR ‘O’
‘P’ FOR ‘P’
‘Q’ FOR ‘Q’
‘R’ FOR ‘R’
‘S’ FOR ‘S’
‘T’ FOR ‘T’
‘U’ FOR ‘U’
‘V’ FOR ‘V’
‘W’ FOR ‘W’
‘X’ FOR ‘X’
‘Y’ FOR ‘Y’
‘Z’ FOR ‘Z’
‘0’ FOR ‘0’
‘1’ FOR ‘1’
‘2’ FOR ‘2’
‘3’ FOR ‘3’
‘4’ FOR ‘4’
‘5’ FOR ‘5’
‘6’ FOR ‘6’
‘7’ FOR ‘7’
‘8’ FOR ‘8’
‘9’ FOR ‘9’
‘.’ FOR ‘.’
‘,’ FOR ‘,’
‘-‘ FOR ‘-‘
‘ ‘ FOR ‘ ‘.

※上記サンプルコードの注意点:
このサンプルコードは、ALPHABET句の効果を概念的に示すためのものです。実際のCOBOLのSORT文は、通常、ファイル入出力を伴います。ここでは、ファイル処理部分を省略し、メモリ上の配列を並べ替えるようなイメージで記載しています。
また、`SORT`文で`USING`や`GIVING`句を使用する場合、対応するファイル定義(`FILE SECTION`)が必要です。このサンプルでは、その詳細を省略しています。
本来、ALPHABET句で定義したカスタムソート順は、`SORT`文の`ON ASCENDING KEY`や`ON DESCENDING KEY`句で指定されるキーフィールドに適用されます。

応用と注意点

ALPHABET句は、特定の業界標準や、独自のデータフォーマットにおけるソート順を定義する際に非常に強力なツールとなります。
しかし、以下の点に注意が必要です。

  • 移植性: ALPHABET句の定義は、コンパイラや実行環境によっては互換性の問題が生じる可能性があります。標準的なASCIIやEBCDIC以外の定義を行う場合は、十分なテストが必要です。
  • 可読性: 複雑なALPHABET句の定義は、プログラムの可読性を低下させる可能性があります。定義には、十分なコメントを付け、分かりやすく記述することを心がけましょう。
  • パフォーマンス: カスタマイズされたソート順は、標準的なソートよりも処理に時間がかかる場合があります。パフォーマンスが重要な箇所での使用は、慎重に検討する必要があります。

ALPHABET句を理解し、適切に活用することで、COBOLプログラムの表現力と柔軟性をさらに高めることができます。ぜひ、皆さんの開発現場でも試してみてください。

コメント

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