Hi guys,
I'm just new to this group. Thought this might help you in some way though.
Below is a sample of the codes which I have been using for converting fixed length records to csv format.
Henri.....
WORKING-STORAGE SECTION.
01 CSV-WORK-AREA.
05 CSV-INPUT-AREA PIC X(40) VALUE SPACES.
05 CSV-INPUT-AREA-SIZE PIC 9(02) VALUE ZEROES.
05 LEADING-SPACES-COUNT PIC 9(02) VALUE ZEROES.
05 TRAILING-SPACES-COUNT PIC 9(02) VALUE ZEROES.
05 DATA-LENGTH PIC 9(02) VALUE ZEROES.
05 DELIMITER-INDICATOR PIC 9(02) VALUE ZEROES.
88 DATA-HAS-DELIMITER VALUES 1 THRU 99.
05 CSV-DELIMITER PIC X(01) VALUE ",".
05 DOUBLE-QUOTE PIC X(01) VALUE '"'.
05 START-OF-DATA-PTR PIC 9(02) VALUE ZEROES.
05 CSV-INSERT-POSITION PIC 9(02) VALUE ZEROES.
05 CSV-RECORD PIC X(100) VALUE SPACES.
01 DATA-SOURCE.
05 RECORD-1.
10 FILLER PIC X(02) VALUE "A1".
10 FILLER PIC 9(05) VALUE 1111.
10 FILLER PIC X(10) VALUE "John Rae".
10 FILLER PIC X(10) VALUE "Doe".
10 FILLER PIC X(25) VALUE "14 Apt 123 Unknown St.".
10 FILLER PIC X(12) VALUE "Any City".
10 FILLER PIC X(03) VALUE "YZ".
10 FILLER PIC X(06) VALUE " ".
05 RECORD-2.
10 FILLER PIC X(02) VALUE " ".
10 FILLER PIC 9(05) VALUE 2222.
10 FILLER PIC X(10) VALUE "Jane".
10 FILLER PIC X(10) VALUE "Day".
10 FILLER PIC X(25) VALUE " 87 Which St, Unit 10".
10 FILLER PIC X(12) VALUE "What City".
10 FILLER PIC X(03) VALUE "UX".
10 FILLER PIC X(06) VALUE "A1B2C3".
01 RECORD-MAP.
10 RM-CATEGORY PIC X(02).
10 RM-ID-NUMBER PIC 9(05).
10 RM-FIRSTNAME PIC X(10).
10 RM-LASTNAME PIC X(10).
10 RM-ADDRESS PIC X(25).
10 RM-CITY PIC X(12).
10 RM-STATE PIC X(03).
10 RM-ZIP PIC X(06).
PROCEDURE DIVISION.
PROGRAM-LOGIC SECTION.
MOVE RECORD-1 TO RECORD-MAP.
PERFORM CREATE-CSV-RECORD.
MOVE RECORD-2 TO RECORD-MAP.
PERFORM CREATE-CSV-RECORD.
STOP RUN.
CREATE-CSV-RECORD SECTION.
DISPLAY "FIX: " RECORD-MAP.
INITIALIZE CSV-RECORD
CSV-INSERT-POSITION.
MOVE RM-CATEGORY TO CSV-INPUT-AREA.
PERFORM CONVERT-TO-CSV-FORMAT.
MOVE RM-ID-NUMBER TO CSV-INPUT-AREA.
PERFORM CONVERT-TO-CSV-FORMAT.
MOVE RM-FIRSTNAME TO CSV-INPUT-AREA.
PERFORM CONVERT-TO-CSV-FORMAT.
MOVE RM-LASTNAME TO CSV-INPUT-AREA.
PERFORM CONVERT-TO-CSV-FORMAT.
MOVE RM-ADDRESS TO CSV-INPUT-AREA.
PERFORM CONVERT-TO-CSV-FORMAT.
MOVE RM-CITY TO CSV-INPUT-AREA.
PERFORM CONVERT-TO-CSV-FORMAT.
MOVE RM-STATE TO CSV-INPUT-AREA.
PERFORM CONVERT-TO-CSV-FORMAT.
MOVE RM-ZIP TO CSV-INPUT-AREA.
PERFORM CONVERT-TO-CSV-FORMAT.
DISPLAY "CSV: " CSV-RECORD.
CONVERT-TO-CSV-FORMAT SECTION.
PARSE-CSV-INPUT-AREA.
INITIALIZE CSV-INPUT-AREA-SIZE
DELIMITER-INDICATOR
LEADING-SPACES-COUNT
TRAILING-SPACES-COUNT
START-OF-DATA-PTR
DATA-LENGTH.
IF CSV-INPUT-AREA NOT = SPACES
* Check for delimiter
INSPECT CSV-INPUT-AREA
TALLYING DELIMITER-INDICATOR FOR ALL CSV-DELIMITER
* get data length
INSPECT CSV-INPUT-AREA
TALLYING LEADING-SPACES-COUNT FOR LEADING SPACES
INSPECT CSV-INPUT-AREA
TALLYING TRAILING-SPACES-COUNT FOR TRAILING SPACES
COMPUTE CSV-INPUT-AREA-SIZE = FUNCTION LENGTH(CSV-INPUT-AREA)
COMPUTE DATA-LENGTH = CSV-INPUT-AREA-SIZE
- LEADING-SPACES-COUNT
- TRAILING-SPACES-COUNT
END-IF.
POST-CSV-DATA.
* need to do this in case first field encountered is blank
IF CSV-INSERT-POSITION = 0
MOVE 1 TO CSV-INSERT-POSITION
ELSE
MOVE CSV-DELIMITER TO CSV-RECORD(CSV-INSERT-POSITION:1)
ADD 1 TO CSV-INSERT-POSITION.
IF DATA-LENGTH > 0
* insert a double quote if the string has an embedded comma
IF DATA-HAS-DELIMITER
MOVE DOUBLE-QUOTE TO CSV-RECORD(CSV-INSERT-POSITION:1)
ADD 1 TO CSV-INSERT-POSITION
END-IF
COMPUTE START-OF-DATA-PTR = LEADING-SPACES-COUNT + 1
MOVE CSV-INPUT-AREA(START-OF-DATA-PTR

ATA-LENGTH)
TO CSV-RECORD(CSV-INSERT-POSITION

ATA-LENGTH)
ADD DATA-LENGTH TO CSV-INSERT-POSITION
IF DATA-HAS-DELIMITER
MOVE DOUBLE-QUOTE TO CSV-RECORD(CSV-INSERT-POSITION:1)
ADD 1 TO CSV-INSERT-POSITION
END-IF
END-IF.
CONVERT-TO-CSV-FORMAT-EXIT.
EXIT.