【COBOL 読み1-20】切っても切れない DELIMITED BY

🧩今日の学び
STRING/UNSTRING は「どこまで拾うか」を DELIMITED で決める職人芸
SIZE は“全部使う”、ALL は“ここで止める”という境界思想
・COBOLが曖昧を許さない理由は「事故を防ぐための世界観」にある

今日のコード

       WRITE-DETAIL-LINE.
           STRING
              "DATE="    DELIMITED BY SIZE F-ORDER-DATE-A DELIMITED BY SIZE
              "  ID="    DELIMITED BY SIZE F-ORDER-ID-A   DELIMITED BY SIZE
              "  SKU="   DELIMITED BY SIZE F-SKU-A        DELIMITED BY SIZE
              "  QTY="   DELIMITED BY SIZE F-QUANTITY-A   DELIMITED BY SIZE
              "  UNIT="  DELIMITED BY SIZE F-UNIT-PRICE-A DELIMITED BY SIZE
              "  TAXR="  DELIMITED BY SIZE F-TAX-RATE-A   DELIMITED BY SIZE
              "  CTY="   DELIMITED BY SIZE F-COUNTRY-A(1:2) DELIMITED BY SIZE
              "  GROSS=" DELIMITED BY SIZE
           INTO OUT-REC
           END-STRING
           WRITE OUT-REC.
WRITE-DETAIL-LINE.

なるお)だから、詳細を書きまっせーってとこかな。

STRINGで文字列だと思うけど、なんの命令なのこれ…
DELIMITEDDELIMITEDうるさいんですけど…何回書けば気がすんじゃい。

係長)おっ、ついに来たな。STRING文
COBOL界では「文字をくっつける職人芸」みたいな命令だ。

な)職人芸!? そんなに? けん玉の刺す部分に玉を刺せる人?

係)ま、まぁ、それなりに技術はあると思うが…

COBOLには「+」で文字を連結する機能がない。
だから文字をまとめたいときは、STRING文を使うしかない。

たとえばこれ

STRING "Hello " DELIMITED BY SIZE "World" DELIMITED BY SIZE INTO GREETING

って書くと、 GREETING"Hello World" ができる。

な)え、じゃあ "Hello " + "World" って書けないの?

STRING文は“くっつけ職人”:COBOLの連結ルール

係)書けない。COBOLは算術の世界の住人だから、「+」は数字専用。

文字を扱うときは、「どこからどこまで」を必ず指定しなきゃならん。
DELIMITED BY SIZE は、「この文字列全体を使え」って意味だ。

もしF-ORDER-ID-A DELIMITED BY SPACEみたいに書くと、最初のスペースが出てきた時点で区切る。

つまり「空白までで切る」。

な)あーなるほど、つまり「どこまで読むか」を全部書かなきゃダメってことすね。

なんかめんどくさいっすね。

係)めんどくさいとか言うな!

COBOLは曖昧を嫌う生き物だってことなんだよ。

DELIMITEDは「区切る基準」を示す呪文みたいなものってことだな。

な)呪文って…社長でも呪い殺そうと?

係)俺の目の前のやつでもいいけどな。

な)だめっすよ、課長を呪い殺しちゃ!

出世できないからって殺っちゃうなんて…でも、いつか…いつか殺ると思ってました!……グスン
って言わせないでくださいね!

係)なんでそうなるんだよ!

…ゴホン。このコードだと

"DATE=" & F-ORDER-DATE-A &
"  ID=" & F-ORDER-ID-A &
"  SKU=" & F-SKU-A &
...(以下略)...

最終的に全部くっつけて OUT-REC に詰め込んで、最後に WRITE OUT-REC. で出力(ファイルとか画面とか)してる。

な)うわー、息苦しい世界ですねー。エベレストですかここ?
係長と一緒にいるだけで酸素が足りないってのに。

係)お前ね…

な)そうだ酸素バー行きましょ!酸素吸い放題ですよ!

係)わかったわかった、窒素を感じろとか言ってたのは何なんだよ。

いいかCOBOLは「察しない」。全部言わないと動かない。

上司の話をまるで聞かない部下みたいなもんだ。じー。

な)係長!課長いい人ですよ、態度変えて行きましょうよ!
係長の歳で自虐はかなしくなりますから、ね!

係)俺の話はこれっぽっちもしてねーよ!

な)そういえば、DELIMITEDって出しゃばりすぎですけど、実際何なんです?

係)DELIMITED はつまり「どこで区切るか」を示すキーワードだ。

COBOLでのDELIMITEDは、英語の delimit(境界を決める、区切る)から来てる。

つまり――

“どこまでをひとまとまりとみなすか”

を指定してやるためのものだ

DELIMITEDは“どこまで拾うか”を決める呪文

たとえば、前にやった UNSTRING 覚えてるか?覚えてねーよな?

UNSTRING IN-REC DELIMITED BY ALL ","
   INTO F-ORDER-DATE-A
        F-ORDER-ID-A
        F-BUYER-A

これは「カンマ(,)で区切って分割しろ」って意味だったな。
DELIMITED BY ALL “,” は「カンマが出るたびに切る」。

で、今回の STRING のほうは逆。

STRING "DATE=" DELIMITED BY SIZE F-ORDER-DATE-A DELIMITED BY SIZE
   INTO OUT-REC

「複数の文字列をくっつけるとき、どこまでを拾うか」を指定してる。

な)どこまでっつっても、SIZEっつったり、ALLつったり、どっちも同じような感じに見えるんですけど

SIZE と ALL の違い:全部拾うか、境界で止めるか

係)そこに気づくのはだいぶ COBOL 耳になってきた証拠だな。

でもな、SIZEALL は似てるようで全然違ぇんだ。

これ整理しとくぞ。

DELIMITED BY SIZE

この項目(文字列)全体を使え」って指定。

つまり「長さぴったり分」を連結・切り出す。

STRING "ABC" DELIMITED BY SIZE
       "DEF" DELIMITED BY SIZE
   INTO RESULT

これは RESULTABCDEF が入る。

つまり “全部くっつけろ” の意味。

DELIMITED BY ALL "X"

「“X” が出てきたら、そこで切れ」って指定。

UNSTRING IN-DATA DELIMITED BY ALL ","
   INTO ITEM1 ITEM2 ITEM3

カンマで区切って分ける。

こっちは “指定文字を区切りとして扱え” の意味。

DELIMITED BY SPACE

「最初のスペースで終わり」とみなす。

STRING F-NAME DELIMITED BY SPACE
       F-AGE  DELIMITED BY SIZE
   INTO OUT-REC

F-NAME の最初の空白までを使う。

(「名前」と「年齢」をくっつけて出力したいときとか)

な)なるほどーのどぐろー。
SIZEは「範囲で指定」ALLは「境界で指定」って感じか。

おむすび

係)そうだ。

前者は「全部拾え」、後者は「ここまでで止めろ」。

人生でも同じだな、

“どこまで関わるか” と “どこで切るか” は全然違ぇんだよ。

な)人間もどこまで関わるか、切るかはありますよねー。

係)俺はお前を切ってるけどな。

な)切っても切れないんですね!わかります。

係長)いや、切りたいんだって!

係長のワンポイント

DELIMITED は「どこまで拾うか」を明示する COBOL の境界指定だ。
SIZE は“項目全体をそのまま使え”、ALL は“指定文字が出たらそこで止まれ”。
STRING は“連結の境界”、UNSTRING は“分割の境界”を DELIMITED で決める仕組みだ。
どこまで読むかを自分で書かないと動かない──それが COBOL の流儀。
迷ったら「全部使うなら SIZE、切るなら ALL」とだけ覚えとけ。

次回続き【COBOL 読み1-20-2】愛憎とINTOとインデントと

― 目次(読みシリーズ)へ戻る ―

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする