在单元格中使用换行读取数据集 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.
我们正在使用以下代码从应用服务器读取 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.