*-- 項目定義
DATA: LV_STR TYPE I,
LV_OFFSET TYPE I,
LV_COUNT_QUOTE TYPE I,
LV_JUDGE TYPE STRING.
DATA :C4_FILE TYPE STRING.
DATA :L_TEST1 TYPE STRING.
DATA :L_TEST2 TYPE STRING.
DATA:L_BEG TYPE I.
DATA:L_END TYPE I.
TYPES:
BEGIN OF OFFSET,
BEG TYPE I,
END TYPE I,
END OF OFFSET.
DATA L_R_OFFSET TYPE OFFSET.
DATA L_I_OFFSET TYPE STANDARD TABLE OF OFFSET.
DATA L_I_STRING TYPE STANDARD TABLE OF STRING.
** ダブル引用符「""」の削除
* REPLACE ALL OCCURRENCES OF K_WQUOTE IN C4_FILE
* WITH K_NULL.
* CSV
* ab"c,d2 te""st ww,w qq:" ee
C4_FILE = '"ab""c,d2","te""""st","ww,w","qq:""",ee'.
* 文字数(バイト数)の取得
LV_STR = STRLEN( C4_FILE ).
* 左から1バイトずつ判定
DO.
CLEAR: LV_JUDGE.
LV_JUDGE = C4_FILE+LV_OFFSET(1).
* 「"」(引用符)の場合、引用符カウントをインクリメント
IF LV_JUDGE = K_DOQ.
LV_COUNT_QUOTE = LV_COUNT_QUOTE + 1.
* 「,」(カンマ)の場合、区切り文字判定を実施
ELSEIF LV_JUDGE = K_COM.
* 「"」(引用符)が偶数値、かつ、「,」(カンマ)の場合、区切り判定
IF ( LV_COUNT_QUOTE MOD 2 ) = 0.
* 指定区切り文字(タブ)をセット
REPLACE SECTION OFFSET LV_OFFSET LENGTH 1
OF C4_FILE WITH K_TAB.
L_R_OFFSET-END = LV_OFFSET - 1.
APPEND L_R_OFFSET TO L_I_OFFSET.
L_R_OFFSET-BEG = LV_OFFSET + 1.
* 「"」(引用符)が奇数値、かつ、「,」(カンマ)の場合、区切りではない
ELSE.
* 処理なし
ENDIF.
ELSE.
* 処理なし
ENDIF.
* オフセット位置をインクリメント
LV_OFFSET = LV_OFFSET + 1.
* 判定対象の文字数を超過する場合、処理を抜ける
IF LV_OFFSET = LV_STR.
EXIT.
ENDIF.
ENDDO.
SORT L_I_OFFSET BY END DESCENDING.
LOOP AT L_I_OFFSET INTO L_R_OFFSET.
* 指定区切り文字(タブ)をセット
REPLACE SECTION OFFSET L_R_OFFSET-END LENGTH 1
OF C4_FILE WITH K_NULL.
* 指定区切り文字(タブ)をセット
REPLACE SECTION OFFSET L_R_OFFSET-BEG LENGTH 1
OF C4_FILE WITH K_NULL.
ENDLOOP.
* ダブル引用符「""」の削除
REPLACE ALL OCCURRENCES OF K_WQUOTE IN C4_FILE
WITH K_DOQ.
split C4_FILE at K_TAB INTO TABLE L_I_STRING.
---------------
csvファイル取込
来源:https://www.cnblogs.com/mordred0123/p/10831158.html