【COBOL 書き1-9-9】改行はByte(バイト)を疑え!ネオニュータイプ誕生

🧩今日の学び
・固定長ファイルは「文字数」ではなく「バイト数」で構造が決まる
・改行コードも実際にはバイトデータとして存在し、READ位置をズラす原因になる
LINE SEQUENTIALを使うことで、改行を「レコード終端」として扱える

📝 COBOL 途中経過
PERFORM UNTIL EOF-FLAG = "Y"
    READ NARUO-FILE
        AT END
            MOVE "Y" TO EOF-FLAG
        NOT AT END
            なんかやること
    END-READ
END-PERFORM.

係長)で、ループがこれだとしてだ、「なんかやること」のところを作っていくぞ。

なるお)そんなのは、やりたい人がやればいいんじゃないすか?

係)お前がやれって言ってんだよ!

な)いやー自由主義なんでー

やるもやらないも自由。給料をもらう自由。ボーナスを2倍要求する自由。全て自由なんです。

係)お前を一刻も早くクビにするよう言っておくわ。

な)現実は残酷!

係)いいからやれってんだ!

な)あひーん…

…んで、何させるんです?

ループ処理は本当に正しく動いているのか

係)何って、まず、お前の考えが正しいかどうか、確認してみろ。

な)確認?

係)大した量のデータじゃないんだ。最後まで回して、今のデータを一つずつ表示させてみろ。

な)あーい

てことは、DISPLAYっちゃえばいいわけよね。

それぞれの列はこう決めてたから、

📝 COBOL sample.cob
    05 SALE-DATE   PIC X(10).
    05 ITEM-NAME   PIC X(20).
    05 AMOUNT      PIC 9(5).

これをDISPLAYするってわけで、こう!

📝 COBOL 途中経過
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.

これを基本にして、清書するとー

📝 COBOL ndata.cob
  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.

こんな感じですかにー

あ、そうそう、データも半角文字に直さないとですよね〜

📝 COBOL naruo2.txt
2025-12-31hoshiimo            02500
2026-01-01gyudon2             00900
2026-01-01curry               01500
2026-01-02gyudon2             00900
2026-01-03hoshiimo            02500

で、はい!うっとりGO!

💻 ターミナル出力 sample.cob
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を入れてみて確認してみると

📝 COBOL sample.cob
        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のところのピリオドは消せ。今回は、そこで終わらず続いているからな。

な)へい!

だったらこうからのー

📝 COBOL sample.cob
  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-FLAGYになるまでループするって前提であって、ずっとNOT AT ENDに進むと。改行が目印となって、レコードを読み込んでくれると…

あ!最後のレコードで改行してないからとかじゃないのこれ!?

だったら、

📝 COBOL naruo2.txt
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は文字を読む言語ではなく、“バイト単位の構造”を制御する言語だ。

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

この記事を書いた人

コメント

コメントする

CAPTCHA