【COBOL 読み1-12】愛故に〜カンマで区切られる人生

🧩今日の学び
・UNSTRINGとDELIMITED BY ALL “,” でCSVの1行を正確に分割できることを理解。
・連続カンマ=空欄をどう扱うかを、係長の辛口ツッコミでしっかり腹落ち。
・次回は「UNSTRING後のデータの扱い方」へ踏み込み、CSV処理の本丸に近づく。

今日のコード

           UNSTRING IN-REC DELIMITED BY ALL ","
              INTO F-ORDER-DATE-A
                   F-ORDER-ID-A
                   F-BUYER-A
                   F-SKU-A
                   F-QUANTITY-A
                   F-UNIT-PRICE-A
                   F-TAX-RATE-A
                   F-COUNTRY-A
           END-UNSTRING.

UNSTRINGって何もの?最初の壁を突破する

UNSTRING IN-REC DELIMITED BY ALL ","

う…ん…UNSTRING?DELIMITED??INTO???

そうね、そうだよね。だよね。あれだよね。

変数がならんでるから、多分変数になにかを入れるんだよ。”,” これ?
変数に入れるの?全部ALL?
All for One?全ては俺のために?すべての愛はお前のために?ストーカーっすか?

係)お前、愛とか恋とかから遠い存在なのに、愛とかよく言えるな。

な)失礼な!恋愛ハラっすか!?ハラスメントビジネスに新しい枠作られますよ!?

係)でも、ま、だんだんCOBOL語を理解してきてるんだな。

な)へ!?なんでいきなりデレるとか!好きになっちゃうパターンですって!
そこら辺に転がってるようなラノベになっちゃいますって!

CSVを切り分ける:DELIMITED BY ALL の本当の意味

係)ここは CSV1行をカンマで分解して、変数に入れる処理 だ。

な)(やっぱり無視…)

UNSTRING

係)「文字列を切り分けろ」というCOBOLの命令。
Pythonでいう split(“,”) みたいなもんだ。

IN-REC

さっき READ INFILE で読んできた、512文字の「1行分の生データ」。
CSVの1行そのまんまだな。

DELIMITED BY ALL “,”

「区切り文字はカンマ。連続するカンマがあっても全部区切りと見なせ」って意味で、ALL があるから、,,, って続いても空欄扱いで分割してくれる。

INTO F-ORDER-DATE-A …

「分割して得られた1つめをF-ORDER-DATE-A、2つめをF-ORDER-ID-A…に順番に突っ込め」って指定。

な)カンマなんてどこにあるんです?

係)CSVの生データ(IN-REC)の中に「,(カンマ)」が並んでるんだよ。

注文日, 注文番号, バイヤー名, SKU, 数量, 単価, 税率, 国コード …って感じでな。

例えば IN-REC にこんなのが入ってるとする

2025-09-30,ORD12345,John Doe,SKU-999,2,199.99,0.1,JP

これを UNSTRING … DELIMITED BY ALL “,” で切ると…

  • F-ORDER-DATE-A = “2025-09-30”
  • F-ORDER-ID-A = “ORD12345”
  • F-BUYER-A = “John Doe”
  • F-SKU-A = “SKU-999”
  • F-QUANTITY-A = “2”
  • F-UNIT-PRICE-A = “199.99”
  • F-TAX-RATE-A = “0.1”
  • F-COUNTRY-A = “JP”

ってな感じで変数に入ってくるってわけだ

な)あーデータの中にカンマが入っていて、そのカンマまでをF-ORDER-DATE-A、次のカンマまでをF-ORDER-ID-Aに入れていけってことっすか。

ソースコードの中に「,」がいっぱい並んでるのかと。
係長のことだから、そんな嫌がらせがくるのかなと。

係)お前さ…コードがカンマで埋まってたら、誰も読めねーだろ。

CSV読んでるからカンマで区切ってんだよ。

な)そー言えば、CSVってカンマ区切りで決まりじゃないですよね?

係)まぁカンマが「事実上の標準」だな。

CSV = Comma-Separated Values の略だしな。
名前からして「カンマで区切る値」ってことだ。

ただなー、世の中はひねくれ者ばっかだから、

  • アメリカ → カンマ区切りが普通
  • ヨーロッパ → 小数点にカンマを使うから、区切りはセミコロン ; にしたりする
  • Excel → 区切り文字は「その国のロケール(言語設定)」次第で、カンマだったりタブだったり

な)え、Excel のやつ、国ごとに区切り変わるんすか!?アメリケーヌのくせに!?

係)くせに言うな。
だから「CSVなんだからカンマだろ!」って思い込むと、海外のデータでズッコケる。

COBOL の DELIMITED BY ALL “,” ってのは、さっきも言ったとおり「カンマが1個でも2個でも3個でも、連続してるカンマをまとめて区切りとみなせ」って指定だ。

空欄はどう読む?連続カンマと人生の話

な)連続したカンマ?
データで連続したカンマとかそこに情報なさすぎってことっすよね?悲しい人生じゃないっすか?もっと激動な人生にしてあげてくださいよ!

「俺は58年前に生まれたが、気づいたら俺はもう寿命だった。」とか目も当てられないですよ。何もしてないっすよ?

あ、58歳だからって係長のことじゃないっすよ。目も当てられない人生じゃないっすよ?まだまだいけますって!!

係)そもそも、なんで俺が死にそうになってんだよ。お前のほうが健康診断の結果わるいだろ。

だから、いいんだよそんなことは。

例えばデータがこうだったとする。

2025-09-30,,Alice,,3,120.00,0.1,JP

空欄のとこはカンマが続くわけだ。

ここで DELIMITED BY “,” になると、例えば「,,」とか「,,,」が、ひとつのカンマと捉えてしまうから、空欄をうまく扱えなくなるってことだ。

おむすび

な)…愛が連続しても空欄になるんすね…。人生も愛も儚いですね…

係)今日ほんと愛愛うるせーな。振られたのか?まぁそうだろうな。それは仕方がない。やり直せ、やり直しても変わらんかもしれないが。まだ時間がある、死ぬまでやり直せるぞ!

な)うっさい…

係)お前の真似しただけだからな。

係長のワンポイント

“ALL” は「続く区切り文字をまとめて扱え」という指示だ。

CSV に ,, とか ,,, が出てきた時、
• ALL なし → カンマ1個分しか区切らず、空欄を見失う
• ALL あり → 連続したカンマを「空欄がある」と正しく認識する

要するに、
“ALL” は CSV の空欄(ブランク)を落とさないための安全装置。
これが入ってるかどうかで、後ろのデータが全部ズレる。

現場で一番やらかすポイントだから、ここだけは絶対に覚えとけ。

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

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

この記事を書いた人

コメント

コメントする