*> ============================================================ *> main-csv-anomaly : CDR CSV异常系测试 (CSV Anomaly) *> Input : CSV-IN (CSV-INPUT.DAT: 异常CSV数据) *> Output: FB-OUT (FB-OUTPUT.DAT: 固定长输出) *> Coverage: CF-A001, CF-A002 *> ============================================================ IDENTIFICATION DIVISION. PROGRAM-ID. CsvAnomaly. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CSV-IN ASSIGN TO "CSV-INPUT.DAT" ORGANIZATION IS LINE SEQUENTIAL. SELECT FB-OUT ASSIGN TO "FB-OUTPUT.DAT" ORGANIZATION IS SEQUENTIAL. DATA DIVISION. FILE SECTION. FD CSV-IN RECORD VARYING FROM 1 TO 200. 01 CSV-REC PIC X(200). FD FB-OUT RECORD CONTAINS 40 CHARACTERS. 01 FB-REC. 05 FB-FIELD1 PIC X(10). 05 FB-FIELD2 PIC X(10). 05 FB-FIELD3 PIC X(10). 05 FB-FIELD4 PIC X(10). WORKING-STORAGE SECTION. 01 WS-EOF PIC X(1) VALUE 'N'. 88 WS-EOF-Y VALUE 'Y' FALSE 'N'. 01 WS-COUNT PIC 9(10). 01 WS-ERR-COUNT PIC 9(10). 01 WS-QUOTE-OPEN PIC X(1) VALUE 'N'. 88 WS-QUOTE-OPEN-Y VALUE 'Y' FALSE 'N'. 01 WS-PASS PIC 9(2) VALUE 0. 01 WS-FAIL PIC 9(2) VALUE 0. 01 WS-TRIM-CSV PIC X(200). 01 WS-CDR-REC. COPY "telecom/TEL-CDR.cpy". PROCEDURE DIVISION. MAIN. DISPLAY "CSV-ANOMALY: Starting CSV anomaly tests" *> CF-A002: 引用符未閉じ → 殘り全部1項目 DISPLAY "CF-A002: Unclosed quote test" OPEN OUTPUT CSV-IN. MOVE '"Field1","Field2","Field3,no-close' TO CSV-REC. WRITE CSV-REC. CLOSE CSV-IN. OPEN INPUT CSV-IN. OPEN OUTPUT FB-OUT. READ CSV-IN INTO WS-TRIM-CSV AT END DISPLAY "CF-A002: Empty read" NOT AT END STRING WS-TRIM-CSV(1:10) WS-TRIM-CSV(11:10) WS-TRIM-CSV(21:10) "TRUNCATED" DELIMITED BY SIZE INTO FB-REC END-STRING WRITE FB-REC ADD 1 TO WS-COUNT DISPLAY "CF-A002: Unclosed quote handled" END-READ. CLOSE CSV-IN FB-OUT. IF WS-COUNT > 0 ADD 1 TO WS-PASS DISPLAY "CF-A002: PASS - unclosed quote processed" ELSE ADD 1 TO WS-FAIL DISPLAY "CF-A002: FAIL" END-IF. *> CF-A001: 改行位置超出RECORD長 DISPLAY "CF-A001: Line exceeding record length" OPEN OUTPUT CSV-IN. MOVE SPACES TO CSV-REC. STRING "SHORT,OKAY,THREE" DELIMITED BY SIZE INTO CSV-REC END-STRING. WRITE CSV-REC. MOVE SPACES TO CSV-REC. STRING "LONG-FIELD-A,LONG-FIELD-B,LONG-FIELD-C," "VERY-LONG-FIELD-D,EXTRA-LONG-FIELD-E" DELIMITED BY SIZE INTO CSV-REC END-STRING. WRITE CSV-REC. CLOSE CSV-IN. OPEN INPUT CSV-IN. OPEN OUTPUT FB-OUT. MOVE 0 TO WS-COUNT. MOVE 'N' TO WS-EOF. PERFORM UNTIL WS-EOF-Y READ CSV-IN INTO WS-TRIM-CSV AT END SET WS-EOF-Y TO TRUE NOT AT END ADD 1 TO WS-COUNT MOVE WS-TRIM-CSV(1:10) TO FB-FIELD1 MOVE WS-TRIM-CSV(12:10) TO FB-FIELD2 WRITE FB-REC END-READ END-PERFORM. CLOSE CSV-IN FB-OUT. IF WS-COUNT = 2 ADD 1 TO WS-PASS DISPLAY "CF-A001: PASS - overlong handled (2 records)" ELSE ADD 1 TO WS-FAIL DISPLAY "CF-A001: FAIL - count=" WS-COUNT END-IF. DISPLAY " " DISPLAY "CSV-ANOMALY: PASS=" WS-PASS " FAIL=" WS-FAIL IF WS-FAIL = 0 DISPLAY "CSV-ANOMALY: ALL PASSED" STOP RUN RETURNING 0 ELSE DISPLAY "CSV-ANOMALY: FAILED" STOP RUN RETURNING 1 END-IF . END PROGRAM CsvAnomaly.