🧩今日の学び
・固定長ファイルは「文字数」ではなく「バイト数」でズレる
・UTF-8では全角文字が複数バイトになるため、固定長設計を崩す原因になる
・COBOLは見た目ではなく、定義された位置とサイズに従って機械的にデータを切り出す
係長) それじゃ、お前のデブデータを読み込んでみろ。
なるお)なんて言い草!
そのうち罰当たりますよ。
係)間違ったこと言ってないだろが。
な)間違いだらけですよ!
カレーライスにカレーヌードル食わないぐらい間違ってますよ!
係)なんで、カレーにカレーなんだよ…
な)え?カレーライスなんだから、汁物はカレーヌードルでしょ?
係)…もういいから…
じゃ、どうするか考えてみろ。
な)えー…どうするかって…
係長が考えて、明日来たらできてますってのはどうです?
係)お前は何してるんだよ!
な)ピザ注文して夜を楽しみますよ!
係)言い切りやがった…
ついに固定長ファイルを読み込む
係)データを読み込む流れを作れって言ってんだよ!
ループさせなくていいから、最初の一行を読み込んで、表示するコードを書け!
な)ぐぅ…
えとー、OPENして、READして、CLOSEするんすよね
なんかこんな話出ていたような。
DATA DIVISION.
FILE SECTION.
FD NARUO-FILE.
01 NARUO-RECORD.
05 SALE-DATE PIC X(10).
05 ITEM-NAME PIC X(20).
05 AMOUNT PIC 9(5).
これで、1行を分解して読めるってことっすよね?
COBOLの名前と実ファイル名を結びつける
係)それはいいんだが、ファイルを使うなら、まずCOBOL側の名前と実際のファイル名を結びつける必要がある。
な)なんで一緒じゃないのさ!
係)それを書くのが、ENVIRONMENT DIVISIONだ。ここはいわゆる環境定義だな。
な)環境定義って、何を定義するんすか?
係)先にコードを示すとこうだ。
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT NARUO-FILE
ASSIGN TO "naruo.txt".
NARUO-FILE がCOBOL側の名前naruo.txt が実際のファイル名
という定義を行うってことだ。
な)へー
ってことは、READするときは、COBOL側の名前を使う?
係)そういうことだ。
READ NARUO-FILE
となる。
実際のファイル名は外側、処理の中では論理名を使うわけだ。
な)うーん
ENVIRONMENT DIVISIONで実ファイルとCOBOL名を結びつける DATA DIVISIONのFILE SECTIONで1行の形を決める PROCEDURE DIVISIONでOPENしてREADしてCLOSEする
てことかしら?
係)いいぞ。ここからがファイル処理だ。
READすると「決めた形」で分解される
な)えーと、まず、PROCEDURE DIVISIONでREADしたら、1行目が読み込まれるんすよね?
そしたら、自動的にここに入ってくれるんです?
05 SALE-DATE PIC X(10). 05 ITEM-NAME PIC X(20). 05 AMOUNT PIC 9(5).
係)そうだ。
な)お!?
係)正確には「決めた形に従って入る」だな。
例えば、最初の1行がこれだったとする。
2025-12-31干し芋 02500
それで、READすると、COBOLはこう考える。
最初の10文字 → SALE-DATE 次の20文字 → ITEM-NAME 最後の5文字 → AMOUNT
な)え?だって、05 SALE-DATE PIC X(10).や05 ITEM-NAME PIC X(20).が、どこの10文字、20文字とか決めてないっすよ?
係)決めてるだろ。
な)ほ?
係)よく見てみろ。
な)これ?
X(10) X(20) 9(5)
係)それだ。その数字が文字数だ。
な)ってことは、固定長のファイルを読み込むときは、文字数ごとに区切られる?ってこと?
係)そうだ。 「どこからどこまで」を定義してるってわけだ。
な)出来杉君よりできるんじゃないんすか、これ!
係)どこに興奮してるんだよ…
な)じゃあ、DISPLAYしたら読み込んだところを見れちゃうって寸法?
係)見れる。
な)あはー!ついにオレのフルコースが公開されてしまう!美食會に狙われちゃう!
係)どうでもいいから、コード完成させてみろ。
な)あーい!
IDENTIFICATION DIVISION.
PROGRAM-ID. NARUO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT NARUO-FILE
ASSIGN TO "naruo.txt".
DATA DIVISION.
FILE SECTION.
FD NARUO-FILE.
01 NARUO-RECORD.
05 SALE-DATE PIC X(10).
05 ITEM-NAME PIC X(20).
05 AMOUNT PIC 9(5).
PROCEDURE DIVISION.
OPEN NARUO-FILE.
READ NARUO-FILE.
DISPLAY SALE-DATE.
DISPLAY ITEM-NAME.
DISPLAY AMOUNT.
CLOSE NARUO-FILE.
STOP RUN.
これでどっすか!うっとりでしょ!
係)うーん⋯。
な)あぁもう、この優越感!
係)足りないところがある。
な)えー、すぐケチつけたがるの止めたほうがいいっすよ!
係)違うっての!
OPENには「何をするか」を指定する
係)ここだ
OPEN NARUO-FILE.
OPENには種類がある。
な)種類?飲む打つ買う?
係)何がだよ!
今回は読むだけだろ。
OPENには何のためにかを付ける必要がある
INPUT = 読み込み OUTPUT = 書き込み I-O = 両方
な)ほほー。単純に開けばいいのに。
いい人ぶったり、めんどくさいやつアピールしたり大変すね。
結構しようって彼氏に言われたけど、踏み切れないのあたい…みたいな感じっすね。
係)なにがだよ⋯
いいか、書き方はこうだ。
OPEN INPUT NARUO-FILE.
コード手直ししてみろ。
な)あーい
1IDENTIFICATION DIVISION. 2PROGRAM-ID. NARUO. 3 4ENVIRONMENT DIVISION. 5INPUT-OUTPUT SECTION. 6FILE-CONTROL. 7 SELECT NARUO-FILE 8 ASSIGN TO "naruo.txt". 9 10DATA DIVISION. 11FILE SECTION. 12 13FD NARUO-FILE. 1401 NARUO-RECORD. 15 05 SALE-DATE PIC X(10). 16 05 ITEM-NAME PIC X(20). 17 05 AMOUNT PIC 9(5). 18 19PROCEDURE DIVISION. 20OPEN INPUT NARUO-FILE. 21 22READ NARUO-FILE. 23 24DISPLAY SALE-DATE. 25DISPLAY ITEM-NAME. 26DISPLAY AMOUNT. 27 28CLOSE NARUO-FILE. 29STOP RUN.
12025-12-31干し芋 02500 22026-01-01牛丼2つ 00900 32026-01-01カレー8人前 01500 42026-01-02牛丼2つ 00900 52026-01-03干し芋 02500
係)では、実行してみろ。
な)あい!うっとりGO!
2025-12-31 干し芋 02
…でたけど、なにこれ?
変にスペース入ってて、改行されてて、次の行が入ってきて??
係)なんでだと思う?
な)え?
なんでって、どうせこぼるんの横暴なんでしょ?
「オメーは酒買ってくれば良いんだよ!」って、働かなくて酒ばっか飲んで酒瓶投げつける旦那なんでしょ?奥さんが「もうだめっ!」って出ていく素振りを見せると、「俺が悪かった、お前がいないと俺はだめなんだ⋯」とか言っちゃうような横暴ぶりでしょ!
係)どんな横暴なんだよ…。
ま、ようやく結果が出たな。ここまで我慢するの大変だったんだぞ。
な)はい?
全角は固定長を破壊する
係)お前が全角を使ってデータ作って得意になってるのを見て、結果が出てあたふたするのを見るのを我慢してたんだからな。
な)はあ!?
なにそれ!知っててスルー!?結果出たら、ざまーみろって!?性格悪っ!神の悪の部分を切り離したピッコロっすか!?その悪意の塊からさらなる悪の部分を卵で吐き出されたマジュニアよりも悪っすか!
係)うるさいな!
今まで言ってきただろ!半角が基本だって!それを忘れて、全角で調子に乗ってるお前が悪いんだろが!干し芋食ってるお前が悪いんだろが!
な)むー!係長のことは悪く言っても、干し芋のことは悪く言わないでくださいよ!
係)干し芋の悪口なんて言ってないだろ!
そもそもなんで俺のことは悪く言って良いんだよ!
いいか、日本語全角は文字コードがUTF-8だと3byteになることが多い。
だから文字数の設定がズレてるって話になるんだよ。
な)あ、そゆこと?
係)何を考えてスペース入れたんだ?
な)え?全角って2文字なのかなーと
係)あーそういうことか。それも合わせて大ズレしたんだな…
な)困ったもんですよね。
係)お前の責任だろ!
な)1バイトは1文字でいいんすよね?
係)ま、それでいいぞ。
な)日付は半角で10文字だからOKで、干し芋でを6文字だと思ってたから、14文字のスペースが入っていたけど,干し芋は9バイトなので、残り11文字分が表示されたけど、残りの3文字分が次にズレて、額がズレた…と。
係)そういう理解でOKだ。
半角にすると、固定長は正しく読める
な)ふむむ…、だったら
2025-12-31hoshiimo 02500
にすればうまくいくと?
係)やってみろ。
な)あい……
みんぎゃああああ!!
係)な、なんだよ!?
な)で、でちゃいましたよ!!
2025-12-31 hoshiimo 02500
係)毎回毎回、うるさいな…
これでわかったろ。全角とか今は余計なことするな。いいな。
な)あい…
おむすび
でも、なんで係長はそんなに性格がひねくれたんです?
係)どういうことだよ…
な)人のミスをほくそ笑むとかひねくれてた上にさらに固く絞り上げたひねくれじゃないっすか!!
係)お前のためになっただろうが!
な)むー、だから盗んだランクルで走り出すんですよ!
係)そんな専門犯罪するかよ!
(次へ続く)
係長のワンポイント
固定長は「見た目の文字数」で切っているわけじゃない。
定義したバイト数どおりに、機械的に区切っている。
よくある誤解は「全角でも文字数が合っていれば大丈夫」だが、それは崩れる。
UTF-8では全角が複数バイトになるため、位置がズレて次の項目まで壊れる。
その結果、固定長は“文字”ではなく“バイト単位の構造”として扱う必要がある。
COBOLは見た目を読む言語ではなく、定義どおりにデータを切る言語だ。


コメント