今回は、顧客の口座番号・名前・残高を含むデータファイルを読み取り、残高が一定以下の口座を抽出して別ファイルに出力するという、実務でもよくある基本的なCOBOLプログラムをご紹介しよう。
プログラムの目的(仕様)
- 入力ファイル:accounts.csv(CSV形式)
- 各行:口座番号, 氏名, 残高
- 残高が 10,000 円未満の顧客を抽出し、low_balance.csv に出力する
- 入力ファイルと出力ファイルはあらかじめ用意しておく。
入力ファイル:accounts.csv
1001,山田太郎,50000
1002,佐藤花子,8000
1003,鈴木次郎,12000
1004,田中美咲,3000
COBOLプログラム :bank_account.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. BANK-ACCOUNT-FILTER.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUT-FILE ASSIGN TO "accounts.csv"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUTPUT-FILE ASSIGN TO "low_balance.csv"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD INPUT-FILE.
01 INPUT-RECORD PIC X(80).
FD OUTPUT-FILE.
01 OUTPUT-RECORD PIC X(80).
WORKING-STORAGE SECTION.
01 WS-EOF PIC X VALUE "N".
01 WS-ACCOUNT-NO PIC X(10).
01 WS-NAME PIC X(20).
01 WS-BALANCE-STR PIC X(10).
01 WS-BALANCE PIC 9(6).
01 WS-BALANCE-DISP PIC 9(6).
01 WS-LINE PIC X(80).
PROCEDURE DIVISION.
MAIN-PROCEDURE.
OPEN INPUT INPUT-FILE
OPEN OUTPUT OUTPUT-FILE
PERFORM UNTIL WS-EOF = "Y"
READ INPUT-FILE
AT END
MOVE "Y" TO WS-EOF
NOT AT END
MOVE INPUT-RECORD TO WS-LINE
PERFORM PARSE-LINE
IF WS-BALANCE < 10000
PERFORM WRITE-LINE
END-IF
END-READ
END-PERFORM
CLOSE INPUT-FILE
CLOSE OUTPUT-FILE
STOP RUN.
PARSE-LINE.
UNSTRING WS-LINE
DELIMITED BY ","
INTO WS-ACCOUNT-NO, WS-NAME, WS-BALANCE-STR
MOVE FUNCTION NUMVAL (WS-BALANCE-STR) TO WS-BALANCE.
WRITE-LINE.
MOVE WS-BALANCE TO WS-BALANCE-DISP
STRING WS-ACCOUNT-NO DELIMITED BY SIZE
"," DELIMITED BY SIZE
WS-NAME DELIMITED BY SIZE
"," DELIMITED BY SIZE
WS-BALANCE-DISP DELIMITED BY SIZE
INTO OUTPUT-RECORD
WRITE OUTPUT-RECORD.
コンパイルと実行
cobc -x -free bank_account.cob
./bank_account
なお、以下の検証環境では 固定形式ではエラーが出る一方、free format(自由形式)でのコンパイルが成功した。
Replit の GnuCOBOL 検証環境
今回は、Replitで動作確認を行った。Replit (無料プラン)で新しい COBOL プロジェクトを作成した。
- Replit の COBOL 環境は GnuCOBOL をベースにしている。
- GnuCOBOL は COBOL ソースを C言語に変換して GCC で実行する仕組みである。
Description: Ubuntu 24.04.2 LTS
Release: 24.04
cobc (GnuCOBOL) 3.1.2.0
Built Dec 23 2020 12:04:58 Packaged Dec 23 2020 12:04:58 UTC
C version “13.2.0”
出力ファイル:low_balance.csv
1002 ,佐藤花子 ,008000
1004 ,田中美咲 ,003000
項目 | 内容 |
UNSTRING | カンマ区切りCSVのフィールドを分割 |
FUNCTION NUMVAL | 残高(文字列)を数値に変換 |
IF WS-BALANCE < 10000 | 閾値(しきいち)条件で抽出 |
STRING … INTO | 出力行の組み立て |
コメント