2013/6/22(土) に行われた 第5回シェル芸勉強会(プレーンタイプ) &第23回#!/beer/bash定例会 の懇親会LTにて発表しました。

内容と説明は、上記参照ということで・・・コードをば。

cat TESTCPY.cbl | cut -b8- | tr -d "\n" | tr "." "\n" | sed 's/^ *//g' | sed 's/(0*/(/g' | sed 's/[()]/ /g' \
|nawk '$3=="PIC" ? ($4=="N" ? $5=$5*2:1) :1' \
|sed 's/ *PIC *[9XN] */ PIC A/g' \
|nawk '$3=="PIC" ? ($6=="COMP-3" ? $4="S9COMP3":1):1' | sed 's/S9COMP3 */H/g' | sed 's/ *COMP-3 *//g' \
|sed 's/ *PIC */ /g' | cut -d " " -f1,3- \
|nawk '{if($2=="OCCURS"){for(i=0;i<$3-1;i++){$(10+i)=$4;$2="";$3=""}}; $1="";print $0}' \
|tr -d " " | tr -d "\n" | xargs -I% perl -nle "@o=unpack(%, \$_);print join(',',@o)" cobolfile.txt

※S9 COMP-3でマイナスがつかなかったりもするし、テストコード作ってないしコードもスパゲッチィな感じなので、お仕事に使うのとかマヂやめてね!

コピー句

000200 03 FILEID PIC 9(02).
000300 03 NAME PIC X(10).
000400 03 PRICE PIC S9(11) COMP-3.
000500 03 TAGS.
000600 10 YYYY PIC 9(04).
000700 10 MM PIC 9(02).
000800 10 DD PIC 9(02).
001000 03 YOBI PIC X(24).
view raw 2_TESTCPY.cbl hosted with ❤ by GitHub

テストデータ作成プログラム

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT OUT01 ASSIGN TO "cobolfile.txt"
ORGANIZATION IS SEQUENTIAL.
*
DATA DIVISION.
FILE SECTION.
FD OUT01
LABEL RECORD STANDARD
DATA RECORD OUT01-R.
01 OUT01-REC PIC X(51).
*
WORKING-STORAGE SECTION.
01 OUT01-INIT PIC X(51).
01 OUT01-R.
COPY TESTCPY.
03 LF PIC X(01).
*
01 FILLER.
10 WK-PACK PIC 9(4) comp-3.
10 WK-STR PIC X(1).
*
PROCEDURE DIVISION.
MAIN-RTN.
PERFORM INITIAL-RTN.
PERFORM EDIT1-RTN.
WRITE OUT01-REC FROM OUT01-R.
PERFORM EDIT2-RTN.
WRITE OUT01-REC FROM OUT01-R.
PERFORM EDIT3-RTN.
WRITE OUT01-REC FROM OUT01-R.
PERFORM END-RTN.
MOVE 0 TO RETURN-CODE.
EXIT.
STOP RUN.
*
INITIAL-RTN SECTION.
OPEN OUTPUT OUT01.
* 固定長行順ファイルのフォーマット
INITIALIZE OUT01-R.
MOVE X'0A' TO LF OF OUT01-R.
MOVE OUT01-R TO OUT01-INIT.
EXIT.
*
END-RTN SECTION.
CLOSE OUT01.
EXIT.
*
EDIT1-RTN SECTION.
MOVE OUT01-INIT TO OUT01-R.
MOVE 1 TO FILEID.
MOVE 'HOGE' TO NAME.
MOVE 123456 TO PRICE.
MOVE '20130621' TO TAGS.
EXIT.
*
EDIT2-RTN SECTION.
MOVE OUT01-INIT TO OUT01-R.
MOVE 2 TO FILEID.
MOVE 'FUGA' TO NAME.
MOVE -123456 TO PRICE.
MOVE '20130622' TO TAGS.
*
EDIT3-RTN SECTION.
MOVE OUT01-INIT TO OUT01-R.
MOVE 3 TO FILEID.
MOVE 'FOO' TO NAME.
MOVE 123 TO PRICE.
MOVE '20130622' TO TAGS.
EXIT.

GistってCOBOLのシンタックスハイライトに対応してないのね。