在单元格中读取带有换行符的数据集CSV

在单元格中读取带有换行符的数据集CSV,csv,abap,Csv,Abap,我们使用以下代码从应用程序服务器读取CSV文件: OPEN DATASET file_str FOR INPUT IN TEXT MODE ENCODING DEFAULT. *--------------------------------------------------* * process and display output *--------------------------------------------------* DO. CLEAR: lv_recor

我们使用以下代码从应用程序服务器读取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文件在单元格中保存换行符:

如果我们用上面的代码读取它,读数据集就在单元的中间,而不是在最后把它拆分。p> 最好的处理方法是什么?我们试图用换行符读取文件,并执行“全部替换”,但似乎无法在读取数据集中可视化换行符


谢谢你的帮助

这是一个标准的字符串处理问题-与ABAP无关,在
BufferedReader.readLine()
中也会遇到同样的问题。只需检查该行是否完整(要么包含正确数量的字段,要么包含偶数个(不带引号的)单元格分隔符,即
),如果不完整,请阅读下一行并将其附加
CL\u ABAP\u CHAR\u UTILITES=>CR\u 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.

有趣的问题。我们也遇到了同样的问题,但…仍然没有解决方案。我们正在考虑编写一个脚本,在应用程序服务器上启动正则表达式。“查找由文本包围的换行符”。您知道内置的
strlen()
function…?@vwegert I like functions:)对我来说更干净:)