【bash】COBOLのコピー句を解析してperlでunpackする
2013/6/22(土) に行われた 第5回シェル芸勉強会(プレーンタイプ) &第23回#!/beer/bash定例会 の懇親会LTにて発表しました。
内容と説明は、上記参照ということで・・・コードをば。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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でマイナスがつかなかったりもするし、テストコード作ってないしコードもスパゲッチィな感じなので、お仕事に使うのとかマヂやめてね!
コピー句
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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). |
テストデータ作成プログラム
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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のシンタックスハイライトに対応してないのね。