在单元格中使用换行读取数据集 CSV

Read Dataset CSV with Line Feeds in Cells

我们正在使用以下代码从应用服务器读取 CSV 文件:

OPEN DATASET file_str FOR INPUT IN TEXT MODE ENCODING DEFAULT.


*--------------------------------------------------*
* process and display output
*--------------------------------------------------*
  DO.
    CLEAR: lv_record,idat.
    READ DATASET file_str INTO lv_record.

    IF sy-subrc NE 0.
      EXIT.
    ELSE.

我们现在遇到的问题是 CSV 文件在单元格中包含换行符:

如果我们用上面的代码读取它,读取的数据集会将它拆分在单元格的中间而不是最后。

处理此问题的最佳方法是什么?我们尝试使用换行符读取文件并进行全部替换,但我们似乎无法在读取数据集中可视化换行符。

感谢您的帮助!

这是一个标准的字符串处理问题 - 与 ABAP 无关,您会遇到与 BufferedReader.readLine() 相同的问题。只需检查该行是否完整(包含正确数量的字段,或包含偶数个(未加引号的)单元格定界符,即 "),如果不完整,请阅读下一行并附加 CL_ABAP_CHAR_UTILITES=>CR_LF,然后重复。

这是解决方案:

 OPEN DATASET file_str FOR INPUT IN TEXT MODE ENCODING DEFAULT.


*--------------------------------------------------*
* process and display output
*--------------------------------------------------*


  DATA: len TYPE i.
  DATA: test TYPE string.
  DATA: lv_new       TYPE i,
        lv_last_char TYPE c.

  DATA: lv_concat TYPE string.
  DO.
    CLEAR: lv_record,idat, lv_concat.
    READ DATASET file_str INTO lv_record.

    IF sy-subrc NE 0.
      EXIT.
    ELSE.

      "-- Get the string length
      CALL FUNCTION 'STRING_LENGTH'
        EXPORTING
          string = lv_record
        IMPORTING
          length = lv_new.

      "-- Check if the string is ended correctly
      lv_new = lv_new - 1.
      lv_last_char = lv_record+lv_new(1).

      IF lv_last_char EQ '"'.
        CONTINUE.
      ELSE.
        "-- Read next line
        CONCATENATE lv_concat lv_record INTO lv_concat.
        CLEAR lv_record.
        WHILE lv_last_char NE '"'.
          READ DATASET file_str INTO lv_record.

          CALL FUNCTION 'STRING_LENGTH'
            EXPORTING
              string = lv_record
            IMPORTING
              length = lv_new.

          lv_new = lv_new - 1.
          lv_last_char = lv_record+lv_new(1).
          CONCATENATE lv_concat lv_record INTO lv_concat.
        ENDWHILE.
      ENDIF.
      IF lv_concat IS NOT INITIAL.
        CLEAR lv_record.
        MOVE lv_concat TO lv_record.
      ENDIF.