COBOLでつくる「銀行口座管理の模擬プログラム」

スポンサーリンク
COBOL

今回は、顧客の口座番号・名前・残高を含むデータファイルを読み取り、残高が一定以下の口座を抽出して別ファイルに出力するという、実務でもよくある基本的な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出力行の組み立て

コメント

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