abap字符串按可输出长度分割

*&---------------------------------------------------------------------*
*& Report YABC_TEXT_LEN
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT YABC_TEXT_LEN.


DATA: GO_SALV       TYPE REF TO CL_SALV_TABLE.

PARAMETERS: P_STR TYPE STRING.
PARAMETERS: P_LEN TYPE I.

DATA: BEGIN OF GT_STR OCCURS 0.
DATA: ZLINE TYPE CHAR255.
DATA: END OF GT_STR.

START-OF-SELECTION.

  PERFORM SUB_GET_STRING_TO_ITAB_LEN TABLES GT_STR USING P_STR P_LEN .
  PERFORM FRM_DISPLAY_ALV TABLES GT_STR USING GO_SALV .



*&---------------------------------------------------------------------*
*&      Form  SUB_TRAN_GET_ZH_EN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM SUB_TRAN_GET_ZH_EN USING I_STR_SPLIT CHANGING CV_ZH CV_EN.
  DATA: LT_RESULT_TAB TYPE MATCH_RESULT_TAB.
  DATA: L_STRM1 TYPE STRING VALUE '[^\\u4E00-\\u9FA5\\uF900-\\uFA2D]'. " 汉字
  DATA: L_STRM2 TYPE STRING VALUE '[\\u4E00-\\u9FA5\\uF900-\\uFA2D]'.  " 非汉字

  DATA: L_STR1 TYPE STRING.

  L_STR1 = I_STR_SPLIT.
  CLEAR: CV_ZH,CV_EN.

  ""提取汉字
  FIND ALL OCCURRENCES OF REGEX L_STRM1 IN L_STR1
           RESULTS LT_RESULT_TAB.
  DESCRIBE TABLE LT_RESULT_TAB[] LINES CV_ZH.
  ""非汉字
  FIND ALL OCCURRENCES OF REGEX L_STRM2  IN L_STR1
           RESULTS LT_RESULT_TAB.
  DESCRIBE TABLE LT_RESULT_TAB[] LINES CV_EN.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form SUB_GET_STRING_TO_ITAB_LEN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM SUB_GET_STRING_TO_ITAB_LEN  TABLES   IT_STR TYPE STANDARD TABLE
                                 USING    I_STR
                                          I_LEN.

  DATA: L_STR_IN    TYPE STRING.    " 字符串
  DATA: L_STR_SPLIT TYPE STRING.    " 分割长度

  DATA: L_LEN       TYPE I.         " 字符串总长度
  DATA: L_IDX       TYPE I.         " 字符串分割截取位置

  DATA: L_ZH        TYPE I.
  DATA: L_EN        TYPE I.

  DATA: L_CON_STR      TYPE STRING.  " 分割拼接当前字符串
  DATA: L_CON_STR_LEN  TYPE I.       " 分割计算当前长度

  L_STR_IN     = I_STR.
  L_STR_SPLIT  = I_LEN.
  L_LEN        = STRLEN( L_STR_IN ).

  DO L_LEN TIMES.
    L_IDX = SY-INDEX - 1.
    DATA(L_CHAR) = L_STR_IN+L_IDX(1).
    PERFORM SUB_TRAN_GET_ZH_EN USING L_CHAR CHANGING L_ZH L_EN.

    """ 累计拼接后的总长度
    L_CON_STR_LEN = L_CON_STR_LEN + L_ZH * 2 + L_EN.

    """"" 分割计算当前长度 大于 分割长度
    IF L_CON_STR_LEN GT L_STR_SPLIT.
      APPEND L_CON_STR TO IT_STR.
      CLEAR: L_CON_STR.
      "" 分割后重新赋值当前字符长度
      CLEAR: L_CON_STR_LEN.
      L_CON_STR_LEN = L_ZH * 2 + L_EN.
    ENDIF.
    L_CON_STR = L_CON_STR &&  L_CHAR.

    """ 计算到总长度位置时
    IF SY-INDEX = L_LEN.
      APPEND L_CON_STR TO IT_STR.
    ENDIF.

  ENDDO.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DISPLAY_ALV TABLES PT_TAB TYPE STANDARD TABLE
  USING LR_TAB     TYPE REF TO CL_SALV_TABLE.


  DATA: LR_FUNS_L  TYPE REF TO CL_SALV_FUNCTIONS_LIST.

  DATA: LR_DISPSET TYPE REF TO CL_SALV_DISPLAY_SETTINGS.
  DATA: LO_EVENTS  TYPE REF TO CL_SALV_EVENTS_TABLE.

  DATA: LR_COLS    TYPE REF TO CL_SALV_COLUMNS_TABLE.
  DATA: LR_SELC    TYPE REF TO CL_SALV_SELECTIONS.

  DATA: L_ERROR    TYPE REF TO CX_SALV_MSG.
  DATA: L_ERR_MSG  TYPE STRING.

  TRY .
      CL_SALV_TABLE=>FACTORY(
        IMPORTING
          R_SALV_TABLE = LR_TAB
        CHANGING
          T_TABLE      = PT_TAB[] ).
    CATCH CX_SALV_MSG INTO L_ERROR.
      L_ERR_MSG = L_ERROR->GET_TEXT( ) .
      WRITE: L_ERR_MSG.
  ENDTRY.

  " 标题
  DATA: L_GC_TITLE TYPE LVC_TITLE.
  DATA: L_LC_COUNT TYPE STRING.

  L_GC_TITLE = TEXT-Z11 .

  DESCRIBE TABLE PT_TAB LINES L_LC_COUNT.
  CONCATENATE SY-TITLE L_GC_TITLE L_LC_COUNT INTO L_GC_TITLE.

  LR_DISPSET = LR_TAB->GET_DISPLAY_SETTINGS( ).
  LR_DISPSET->SET_LIST_HEADER( L_GC_TITLE ).

  " 工具条
  LR_FUNS_L = LR_TAB->GET_FUNCTIONS( ).
  LR_FUNS_L->SET_ALL( ABAP_TRUE ).

  " 设置记录选择框
  LR_SELC = LR_TAB->GET_SELECTIONS( ).
  LR_SELC->SET_SELECTION_MODE( IF_SALV_C_SELECTION_MODE=>CELL ).

  " 设置字段优化
  LR_COLS = LR_TAB->GET_COLUMNS( ).
  LR_COLS->SET_OPTIMIZE( 'X' ).               " 优化列宽度

  LR_TAB->DISPLAY( ).

ENDFORM.

<think>好的,我现在需要帮助用户解决ABAP字符串包含检查失败的问题。首先,我需要回忆一下ABAP字符串处理的相关知识。ABAP字符串操作确实有一些需要注意的地方,特别是涉及到大小写、空格和特殊字符的情况。用户提到的包含检查失败,可能涉及到使用`CS`、`CP`操作符或者`CO`、`CN`等,这些操作符的区别可能会让开发者出错。 首先,我应该检查用户是否正确地使用了操作符。比如,`CS`是区分大小写的包含检查,而`CP`可以使用通配符。如果用户需要不区分大小写,可能需要使用`CA`或者其他方法。另外,字符串前后的空格也可能导致检查失败,需要提醒用户使用`CONDENSE`函数去除多余空格。 接下来,考虑字符集的问题。如果字符串中包含特殊字符或中文字符,可能需要检查系统的代码页是否正确设置,特别是在从外部系统导入数据时,字符转换可能会引发问题。例如,引用[2]中提到中文字符变成乱码,可能与字符编码有关,用户需要确保编码一致。 关于错误处理,引用[3]提到运行时错误需要适当处理,所以建议用户使用异常捕获,比如`TRY...CATCH`块,来捕捉可能的运行时错误,避免程序崩溃。此外,使用`STRLEN`检查字符串长度,避免操作空字符串也是必要的。 用户可能需要具体的示例代码来参考,所以准备一个包含常见操作的代码片段,并注释每个步骤的注意事项。同时,生成相关问题,帮助用户深入理解字符串操作的其他方面,比如连接、替换、分割等,以及性能优化和国际化处理的问题。 最后,确保回答符合格式要求,使用正确的中文,行内公式用$...$,独立公式用`$$...$$`,虽然这个问题可能不涉及数学公式,但需要检查是否有其他格式要求。引用文献部分要正确标注,比如引用[2]和[3]的相关内容。 总结步骤: 1. 分析可能的原因:操作符误用、空格问题、字符集、大小写。 2. 提供解决方案:正确使用操作符,处理空格,转换大小写,检查编码。 3. 错误处理建议:使用异常捕获,预检查字符串。 4. 示例代码演示常见操作。 5. 生成相关问题,扩展用户的知识点。</think>### ABAP字符串包含检查失败解决方案 在ABAP中进行字符串包含检查时,需注意**操作符选择**、**空格处理**、**字符集匹配**和**错误处理机制**。以下是具体解决方案: --- #### 1. 正确使用字符串操作符 - **区分大小写检查**:使用`CS`(Contains String)操作符 ```abap IF lv_str1 CS lv_str2. " 完全匹配,区分大小写 ``` - **通配符模式匹配**:使用`CP`(Contains Pattern)支持`*`和`+` ```abap IF lv_str CP '*abap*'. " 检查是否包含'abap'子串 ``` - **大小写不敏感处理**:先统一转换为大写/小写 ```abap IF to_upper(lv_str1) CS to_upper(lv_str2). ``` --- #### 2. 处理空格与特殊字符 - **去除首尾空格**:使用`CONDENSE`命令 ```abap CONDENSE lv_str NO-GAPS. " 删除所有空格 ``` - **处理不可见字符**:使用`REPLACE`清理控制字符 ```abap REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN lv_str WITH ''. ``` --- #### 3. 字符集与编码问题 若涉及中文等非ASCII字符,需检查**系统代码页**和**传输编码**。例如从外部文件读取时,使用`CL_ABAP_FILE_UTILITIES`指定编码: ```abap DATA(lv_content) = cl_abap_file_utilities=>read_text_file( p_file = 'file.txt' p_code_page = '4110' ). " UTF-8编码 ``` 引用[2]中提到的中文乱码问题,可通过统一编码设置解决。 --- #### 4. 错误处理与防御性编程 - **预检查字符串长度**: ```abap IF strlen( lv_str ) = 0. MESSAGE '字符串为空' TYPE 'E'. ENDIF. ``` - **异常捕获**:使用`TRY...CATCH`处理运行时错误 ```abap TRY. FIND 'ERROR' IN lv_str. CATCH cx_sy_strg_par_val. MESSAGE '无效参数' TYPE 'W'. ENDTRY. ``` 如引用[3]所述,运行时错误需显式处理以避免程序终止。 --- #### 示例代码 ```abap DATA: lv_source TYPE string VALUE 'ABAP Development', lv_substr TYPE string VALUE 'dev'. " 不区分大小写的包含检查 IF to_upper( lv_source ) CS to_upper( lv_substr ). WRITE '包含子串'. ELSE. WRITE '不包含子串'. ENDIF. " 清理特殊字符后的检查 REPLACE ALL OCCURRENCES OF REGEX '[^\x00-\x7F]' IN lv_source WITH ''. IF lv_source CS 'Dev'. WRITE '清理后包含'. ENDIF. ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值