OpenCOBOL | ほっつのブログ

ほっつのブログ

気が向いたときに更新するつもりです。今はお試し記載中。
普段はツイッターでつぶやいています。
http://twitter.com/GR3upper


久しぶりにOpenCOBOLしてみたらハマった感じがしたww。

Linux環境にOpenCOBOL Version 1.1.0入れて試してたら漢字が何か違う!

PICでN桁指定してたが表示にしてもファイル出力にしても桁が合わない&文字化け・・・。

データをDUMPで見てみると2Byteでなくて3Byte・・・っという事は6Byteの倍数データでないと合わないのでは?って事で試してみた。

PCでCOBOLするのも面白いなw。
$ cobc -C -o test00c test00.cob
でCに出力してみたらキャスト多くてうっひゃ~だったかもww。

* Sample Data test00in *************************************
1234567812345678901212345678901299201303012013030220130303
1234567812345678901212345678901299201303012013030220130303
1234567812345678901212345678901299201303012013030220130303
************************************************************

* COPY File ********************************************************************
* [COPY句] test00.if.cob *************************************************
* INPUT-FILE 入力データ
01 IN01-R.
03 IN01-I1 PIC N(12).
* N12桁 × 2Byte = 24Byte ÷ 3Byte = 8桁
03 IN01-I2 PIC X(10).
03 IN01-I3 PIC N(03).
* N3桁 × 2Byte = 6Byte ÷ 3Byte = 2桁
03 IN01-I4 PIC X(12).
03 IN01-I5 PIC 9(02).
03 IN01-I6 OCCURS 3 TIMES.
05 IN01-I6T PIC 9(08).
*******************************************************************************

* ソースファイル *****************************************************************
**************************************************************************
*COBOL:テスト
*PROGRAM-ID:TEST00 << test00.if.cob
*作成:2013/03/21[ほっつ]
*機能概要:データを読込みこんでCSV形式で出力。
* test00inファイル -> test00outファイル
*COMPILE COMMAND:$ cobc -x -o test00 test00.cob
*更新 20xx/xx/xx:なんか修正はするんだろう。
*0011111111112222222222333333333344444444445555555555666666666677777777778
*8901234567890123456789012345678901234567890123456789012345678901234567890
**************************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. TEST00.
AUTHOR. HOTTU.
DATE-WRITTEN. 20013.03.21.
*
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN01-F ASSIGN TO "test00in"
ORGANIZATION IS LINE SEQUENTIAL.
*"test00in" File Test Data Sample
*1234567812345678901212345678901299201303012013030220130303
SELECT OUT01-F ASSIGN TO "test00out"
ORGANIZATION IS LINE SEQUENTIAL.
*
DATA DIVISION.
FILE SECTION.
* 入力ファイル ***************************************
FD IN01-F.
COPY "test00.if.cob".
* 出力ファイル ***************************************
FD OUT01-F.
01 OUT01-R.
03 OUT01-N1 PIC N(12).
03 OUT01-X1 PIC X(12).
03 OUT01-N2 PIC N(03).
03 OUT01-X2 PIC X(43).
* WORK *****************************************
WORKING-STORAGE SECTION.
01 IN01-EOF PIC X(01) VALUE SPACE.
01 CT-W PIC 9(02) VALUE ZERO.
* 出力ファイル編集エリア
01 WK-CSV.
03 WK-I1 PIC N(12).
03 WK-X1.
05 FILLER PIC X(01) VALUE ",".
05 WK-I2 PIC X(10).
05 FILLER PIC X(01) VALUE ",".
03 WK-I3 PIC N(03).
03 WK-X2.
05 FILLER PIC X(01) VALUE ",".
05 WK-I4 PIC X(12).
05 FILLER PIC X(01) VALUE ",".
05 WK-I5 PIC 9(02).
05 FILLER PIC X(01) VALUE ",".
05 WK-I6 PIC 9(08).
05 FILLER PIC X(01) VALUE ",".
05 WK-I7 PIC 9(08).
05 FILLER PIC X(01) VALUE ",".
05 WK-I8 PIC 9(08).
* メイン処理 ****************************************
PROCEDURE DIVISION.
PERFORM INIT-SEC.
PERFORM SUB-MAIN
UNTIL IN01-EOF = HIGH-VALUE
PERFORM END-SEC.
EXIT PROGRAM.
STOP RUN.
* 初期処理 *****************************************
INIT-SEC SECTION.
INIT-STA.
* 入出力ファイルオープン
OPEN INPUT IN01-F.
OPEN OUTPUT OUT01-F.
* 出力領域初期化
INITIALIZE OUT01-R.
INITIALIZE WK-CSV.
* 入力ファイルの初期読込み(1件目)
PERFORM READ-SYORI.
INIT-END.
EXIT.
* 入力ファイル読込み処理 ******************************
READ-SYORI SECTION.
READ-STA.
READ IN01-F
AT END
MOVE HIGH-VALUE TO IN01-EOF
NOT AT END
CONTINUE
END-READ.
READ-END.
EXIT.
* 主処理 *******************************************
SUB-MAIN SECTION.
SUB-MAIN-STA.
*入力ファイルを編集領域に設定
MOVE IN01-I1 TO WK-I1
MOVE IN01-I2 TO WK-I2
MOVE IN01-I3 TO WK-I3
MOVE IN01-I4 TO WK-I4
MOVE IN01-I5 TO WK-I5
*
PERFORM WITH TEST BEFORE VARYING CT-W FROM 1 BY 1
UNTIL CT-W > 3
*
EVALUATE CT-W
WHEN 1
MOVE IN01-I6T(CT-W) TO WK-I6
WHEN 2
MOVE IN01-I6T(CT-W) TO WK-I7
WHEN 3
MOVE IN01-I6T(CT-W) TO WK-I8
END-EVALUATE
*
END-PERFORM.
* 出力ファイル書き出し
* WRITE OUT01-R FROM WK-CSV.
MOVE WK-I1 TO OUT01-N1
DISPLAY "IN01-I1=[" IN01-I1 "]"
DISPLAY "WK-I1=[" WK-I1 "]"
DISPLAY "OUT01-N1=[" OUT01-N1 "]"
MOVE WK-X1 TO OUT01-X1
MOVE WK-I3 TO OUT01-N2
MOVE WK-X2 TO OUT01-X2
WRITE OUT01-R.
* 出力領域初期化
INITIALIZE OUT01-R.
INITIALIZE WK-CSV.
* 入力ファイル読込み
PERFORM READ-SYORI.
SUB-MAIN-END.
EXIT.
* 終了処理 *****************************************
END-SEC SECTION.
END-STA.
* 入出力ファイルクローズ
CLOSE IN01-F.
CLOSE OUT01-F.
END-END.
EXIT.
*******************************************************************************

* 結果 test00out **************************************************
12345678,1234567890,12,123456789012,99,20130301,20130302,20130303
12345678,1234567890,12,123456789012,99,20130301,20130302,20130303
12345678,1234567890,12,123456789012,99,20130301,20130302,20130303
*******************************************************************