Skip to content

Instantly share code, notes, and snippets.

@jmsdnns
Created September 28, 2025 22:11
Show Gist options
  • Select an option

  • Save jmsdnns/832566ec23c05be1bbcec6a6231f1576 to your computer and use it in GitHub Desktop.

Select an option

Save jmsdnns/832566ec23c05be1bbcec6a6231f1576 to your computer and use it in GitHub Desktop.
had claude generate a csv reader in cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. CSV-READER.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CSV-FILE ASSIGN TO "input.csv"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD CSV-FILE.
01 CSV-RECORD PIC X(200).
WORKING-STORAGE SECTION.
01 WS-EOF-FLAG PIC X VALUE 'N'.
01 WS-RECORD-COUNT PIC 9(5) VALUE ZERO.
01 WS-FIELD-COUNT PIC 9(2) VALUE ZERO.
01 WS-FIELD-START PIC 9(3) VALUE 1.
01 WS-FIELD-END PIC 9(3) VALUE ZERO.
01 WS-FIELD-LENGTH PIC 9(3) VALUE ZERO.
01 WS-FIELD-VALUE PIC X(50).
01 WS-COMMA-POS PIC 9(3) VALUE ZERO.
01 WS-CURRENT-POS PIC 9(3) VALUE 1.
01 WS-RECORD-LENGTH PIC 9(3) VALUE ZERO.
01 WS-PARSED-FIELDS.
05 WS-FIELD OCCURS 10 TIMES PIC X(50).
PROCEDURE DIVISION.
MAIN-PROCEDURE.
OPEN INPUT CSV-FILE
PERFORM UNTIL WS-EOF-FLAG = 'Y'
READ CSV-FILE
AT END
MOVE 'Y' TO WS-EOF-FLAG
NOT AT END
ADD 1 TO WS-RECORD-COUNT
PERFORM PARSE-CSV-RECORD
PERFORM DISPLAY-PARSED-FIELDS
END-READ
END-PERFORM
CLOSE CSV-FILE
DISPLAY "Total records processed: " WS-RECORD-COUNT
STOP RUN.
PARSE-CSV-RECORD.
MOVE ZERO TO WS-FIELD-COUNT
MOVE 1 TO WS-CURRENT-POS
COMPUTE WS-RECORD-LENGTH = FUNCTION LENGTH(
FUNCTION TRIM(CSV-RECORD))
PERFORM UNTIL WS-CURRENT-POS > WS-RECORD-LENGTH
PERFORM FIND-NEXT-COMMA
ADD 1 TO WS-FIELD-COUNT
IF WS-COMMA-POS = ZERO
COMPUTE WS-FIELD-LENGTH =
WS-RECORD-LENGTH - WS-CURRENT-POS + 1
MOVE CSV-RECORD(WS-CURRENT-POS:WS-FIELD-LENGTH)
TO WS-FIELD(WS-FIELD-COUNT)
MOVE WS-RECORD-LENGTH TO WS-CURRENT-POS
ELSE
COMPUTE WS-FIELD-LENGTH =
WS-COMMA-POS - WS-CURRENT-POS
IF WS-FIELD-LENGTH > ZERO
MOVE CSV-RECORD(WS-CURRENT-POS:WS-FIELD-LENGTH)
TO WS-FIELD(WS-FIELD-COUNT)
ELSE
MOVE SPACES TO WS-FIELD(WS-FIELD-COUNT)
END-IF
COMPUTE WS-CURRENT-POS = WS-COMMA-POS + 1
END-IF
ADD 1 TO WS-CURRENT-POS
END-PERFORM.
FIND-NEXT-COMMA.
MOVE ZERO TO WS-COMMA-POS
PERFORM VARYING WS-COMMA-POS FROM WS-CURRENT-POS BY 1
UNTIL WS-COMMA-POS > WS-RECORD-LENGTH
OR CSV-RECORD(WS-COMMA-POS:1) = ","
END-PERFORM
IF WS-COMMA-POS > WS-RECORD-LENGTH
MOVE ZERO TO WS-COMMA-POS
END-IF.
DISPLAY-PARSED-FIELDS.
DISPLAY "Record " WS-RECORD-COUNT ":"
PERFORM VARYING WS-CURRENT-POS FROM 1 BY 1
UNTIL WS-CURRENT-POS > WS-FIELD-COUNT
DISPLAY " Field " WS-CURRENT-POS ": ["
FUNCTION TRIM(WS-FIELD(WS-CURRENT-POS)) "]"
END-PERFORM
DISPLAY SPACE.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment