【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で文字列だと思うけど、なんの命令なのこれ…
DELIMITED、DELIMITEDうるさいんですけど…何回書けば気がすんじゃい。

係長)おっ、ついに来たな。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

これは RESULT に “ABCDEF” が入る。

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

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をコピーしました!

この記事を書いた人

コメント

コメントする