🧩今日の学び
・固定長ファイルは「文字数」ではなく「バイト数」で構造が決まる
・改行コードも実際にはバイトデータとして存在し、READ位置をズラす原因になる
・LINE SEQUENTIALを使うことで、改行を「レコード終端」として扱える
PERFORM UNTIL EOF-FLAG = "Y"
READ NARUO-FILE
AT END
MOVE "Y" TO EOF-FLAG
NOT AT END
なんかやること
END-READ
END-PERFORM.
係長)で、ループがこれだとしてだ、「なんかやること」のところを作っていくぞ。
なるお)そんなのは、やりたい人がやればいいんじゃないすか?
係)お前がやれって言ってんだよ!
な)いやー自由主義なんでー
やるもやらないも自由。給料をもらう自由。ボーナスを2倍要求する自由。全て自由なんです。
係)お前を一刻も早くクビにするよう言っておくわ。
な)現実は残酷!
係)いいからやれってんだ!
な)あひーん…
…んで、何させるんです?
ループ処理は本当に正しく動いているのか
係)何って、まず、お前の考えが正しいかどうか、確認してみろ。
な)確認?
係)大した量のデータじゃないんだ。最後まで回して、今のデータを一つずつ表示させてみろ。
な)あーい
てことは、DISPLAYっちゃえばいいわけよね。
それぞれの列はこう決めてたから、
05 SALE-DATE PIC X(10).
05 ITEM-NAME PIC X(20).
05 AMOUNT PIC 9(5).
これをDISPLAYするってわけで、こう!
PERFORM UNTIL EOF-FLAG = "Y"
READ NARUO-FILE
AT END
MOVE "Y" TO EOF-FLAG
DISPLAY "SEKAI NO OWARI"
NOT AT END
DISPLAY SALE-DATE
DISPLAY ITEM-NAME
DISPLAY AMOUNT
END-READ
END-PERFORM.
これを基本にして、清書するとー
1IDENTIFICATION DIVISION. 2PROGRAM-ID. NARUO. 3 4ENVIRONMENT DIVISION. 5INPUT-OUTPUT SECTION. 6FILE-CONTROL. 7 SELECT NARUO-FILE 8 ASSIGN TO "naruo2.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 19WORKING-STORAGE SECTION. 2001 EOF-FLAG PIC X VALUE "N". 21 22PROCEDURE DIVISION. 23OPEN INPUT NARUO-FILE. 24 25PERFORM UNTIL EOF-FLAG = "Y" 26 READ NARUO-FILE 27 AT END 28 MOVE "Y" TO EOF-FLAG 29 DISPLAY "SEKAI NO OWARI" 30 NOT AT END 31 DISPLAY SALE-DATE 32 DISPLAY ITEM-NAME 33 DISPLAY AMOUNT 34 END-READ 35END-PERFORM. 36 37CLOSE NARUO-FILE. 38STOP RUN.
こんな感じですかにー
あ、そうそう、データも半角文字に直さないとですよね〜
2025-12-31hoshiimo 02500 2026-01-01gyudon2 00900 2026-01-01curry 01500 2026-01-02gyudon2 00900 2026-01-03hoshiimo 02500
で、はい!うっとりGO!
2025-12-31
hoshiimo
02500
2026-01-
01gyudon2
009
00
2026-0
1-01curry
0
1500
2026
-01-02gyudon2
00900
20
26-01-03hoshiimo
0250020
26-01-03hoshiimo
SEKAI NO OWARI
え、なにこれ?どゆこと!?
係)おーいい感じだな。
な)なにが!?
係)なんでそうなっていると思う?
な)どうせこぼるんの嫌がらせでしょ!ほんと困った子なんだから!
係)だからお前は誰なんだよ…
出力されたデータをちゃんと見てみろ。
な)むー
1件目は正常、2件目からズレ始める
係)あれ?1つ目はちゃんと出力されてる?そんで、2つ目のデータからズレ始めてる…
だったら4つ目のDISPLAYを入れてみて確認してみると
NOT AT END
DISPLAY SALE-DATE
DISPLAY ITEM-NAME
DISPLAY AMOUNT
DISPLAY "kokomade"
2025-12-31
hoshiimo
02500
kokomade
2026-01-
01gyudon2
009
kokomade
00
2026-0
1-01curry
0
kokomade
1500
2026
-01-02gyudon2
kokomade
00900
20
26-01-03hoshiimo
kokomade
0250020
26-01-03hoshiimo
kokomade
SEKAI NO OWARI
え、なにこれ!?途中4行になってる!?
係)ひとつ目はOKだが、2つ目からずれる
というところを考えて、1行目と2行目に何がある?
な)沸き立つ情熱とか?
係)さっきまで嫌々だったろうが!
な)好きと嫌いは表裏一体なんですよ!
係)そんなことどうでもいいから、何か起きてるだろ!よく見てみろ!!
な)むー…何か起きてるって、宇宙戦争でも起きてるってなら、わかりやすいってもんで……でも、そんなことは微塵もなく、一行目を入れて、干し芋に恋い焦がれ、改行して、牛丼で牛道に勤しみ…
係)それだ!
な)は?華麗にカレー?
係)そんなこと言ってないだろ!その前の話だ!
な)??牛道??
係)そこじゃない!そもそも牛道ってなんだよ!
な)華道や茶道に対抗する新興道で…
係)そんなこと聞いてねーよ!その前の話だよ!
な)あー干し芋!また持ってきます?
係)違うって!改行って言っただろ!
な)あー改行っすか。………何が??
係)お前なぁ!!
改行コードも「1バイト」存在する
係)いいか改行も1バイトになるんだよ!
つまり、お前が設定した10+20+5=35バイトだけじゃなく、改行コードの1バイトが残っているんだよ!
な)えー、なにそのマジック!初代引田天功っすか!?
初代となると一筋縄では行きませんよー。
係)なにがだよ…
な)んーでも、改行分でズレたんだったら、最初は■■2026みたいにスペースから始まるんじゃないんですの?
2026-01- 01gyudon2 009 kokomade
係)お前の切り取り方が悪いな。正確にはこうだ。
2026-01- 01gyudon2 009 kokomade
な)へ!?
あー!!これ最初に改行のバイトが入ってるってことっすか!?
んで改行がなぜか表示されちゃう謎っ子仕様ってことで、実際はこう出力されてる!?
■■ 2026-01-(ここまで1つ目のでーた分) 01gyudon2■■■■■■■■■■■ ■■009 kokomade
係)ようやくたどり着いたか。その理解でいい。
あとは、どんどんズレていっているってわけだな。
な)はひー。え、でも、ずれちゃったらおしまいじゃないっすか。やっぱりSEKAI NO OWARIじゃないっすか!変なこぼるんのクセじゃないっすか、Habitじゃないっすか!
係)騒がしいやつだな。落ち着け。きちんと回避策はある。
な)なんですとー!!
係)なにテンションあがってんだよ…
ORGANIZATION IS LINE SEQUENTIAL で改行を認識させる
SELECT ASSIGN TOのあとにORGANIZATION IS LINE SEQUENTIAL.を追加すると改行をレコードの終わりと認識してくれるんだよ。
な)なんと五車星!!
係)うるさいわ!
あと、ASSIGNのところのピリオドは消せ。今回は、そこで終わらず続いているからな。
な)へい!
だったらこうからのー
1IDENTIFICATION DIVISION. 2PROGRAM-ID. NARUO. 3 4ENVIRONMENT DIVISION. 5INPUT-OUTPUT SECTION. 6FILE-CONTROL. 7 SELECT NARUO-FILE 8 ASSIGN TO "naruo2.txt" 9 ORGANIZATION IS LINE SEQUENTIAL. 10 11DATA DIVISION. 12FILE SECTION. 13 14FD NARUO-FILE. 1501 NARUO-RECORD. 16 05 SALE-DATE PIC X(10). 17 05 ITEM-NAME PIC X(20). 18 05 AMOUNT PIC 9(5). 19 20WORKING-STORAGE SECTION. 2101 EOF-FLAG PIC X VALUE "N". 22 23PROCEDURE DIVISION. 24OPEN INPUT NARUO-FILE. 25 26PERFORM UNTIL EOF-FLAG = "Y" 27 READ NARUO-FILE 28 AT END 29 MOVE "Y" TO EOF-FLAG 30 DISPLAY "SEKAI NO OWARI" 31 NOT AT END 32 DISPLAY SALE-DATE 33 DISPLAY ITEM-NAME 34 DISPLAY AMOUNT 35 END-READ 36END-PERFORM. 37 38CLOSE NARUO-FILE. 39STOP RUN.
うっとりでー………ぐぼおおおお!!
2025-12-31
hoshiimo
02500
2026-01-01
gyudon2
00900
2026-01-01
curry
01500
2026-01-02
gyudon2
00900
2026-01-03
hoshiimo
02500
0
SEKAI NO OWARI
でた!でもなんか違う!?
係)何が「ぐぼお」なんだよ…
な)なんか最後に0があったり、変な改行が続いたりしてますけど、なんで??
係)さてなんででしょうか?
な)クイズの司会者じゃないんだから!
係)さっき俺が言ったこと思い出してみろよ。
な)「今日はなるおも頑張ったから焼肉ぐらいおごってやるか」ですか?
係)言ってねーよ!!そもそもお前と焼肉行ったらいくら払うことになるんだよ!
改行っていっただろ!
最後のレコードだけ崩れる理由
な)また改行っすか?それはさっき解決したんじゃ?
係)ちゃんとループを追ってみろ。
な)ほむむー
EOF-FLAGがYになるまでループするって前提であって、ずっとNOT AT ENDに進むと。改行が目印となって、レコードを読み込んでくれると…
あ!最後のレコードで改行してないからとかじゃないのこれ!?
だったら、
2025-12-31hoshiimo 02500 2026-01-01gyudon2 00900 2026-01-01curry 01500 2026-01-02gyudon2 00900 2026-01-03hoshiimo 02500
これでどうよ!どうなのよ!
2025-12-31 hoshiimo 02500 2026-01-01 gyudon2 00900 2026-01-01 curry 01500 2026-01-02 gyudon2 00900 2026-01-03 hoshiimo 02500 SEKAI NO OWARI
きゃふうう!!
あーもう快感!!
おむすび
係)あのな…
な)もう自分がすごすぎて……これが感無量ってヤツなんすね!最高、最強、何も怖くない!このまま社長室特攻してこようかしら!
係)まてまて…。
そもそも感無量だったら、言葉が出ないだろが…。
な)言葉が出る「Type: 感無量」もあるんですよ!ニュータイプですよ!
係)ニュータイプだったら、見た瞬間に間違いがわかるだろが。
な)だったら、ネオニュータイプですね!
係)劣化してるだけだろ。
な)え!?
係長のワンポイント
改行は「ただの見た目」じゃない。
ファイルの中では、ちゃんと存在するバイトデータだ。
よくある誤解は「35バイト読んだら次の行へ行く」だが、実際は改行コードが残る。
だから固定長だけを定義すると、次のREADで位置が1バイトずつズレていく。
その結果、データ構造そのものが崩壊していく。
LINE SEQUENTIAL を使うことで、改行を「レコード終端」として扱える。
COBOLは文字を読む言語ではなく、“バイト単位の構造”を制御する言語だ。


コメント