CSV文件处理

*-- 項目定義
  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ファイル取込

posted @ 2019-05-08 12:47  Mordred  阅读(114)  评论(0编辑  收藏  举报