【问题标题】:ESQL String Splitter Functions For Splitting Delimited Strings用于拆分分隔字符串的 ESQL 字符串拆分器函数
【发布时间】:2019-05-13 08:30:46
【问题描述】:

ESQL 没有像 Java 这样的内置字符串拆分功能,虽然它很容易构建静态函数并将 *.jar 添加到 IIB 类路径中,但我工作过的几个网站都全面禁止使用 Java。

那么,ESQL 中高效的字符串拆分器是什么样的。

【问题讨论】:

    标签: ibm-integration-bus extended-sql


    【解决方案1】:

    主题的以下四个变体可用于拆分 ESQL 字符串。

    我选择了使用函数名称而不是标志的选项,而不是添加大量参数并以相当复杂的内部逻辑结束。

    拆分字符串

    不添加空字符串,但会添加多个空格的字符串。

    CREATE PROCEDURE SplitString(
        IN CompositeString CHAR,         -- Composite string that needs to be split
        IN Delimiter CHAR,               -- Delimiter to be used when splitting the string
        IN ArrayName CHAR,               -- Name of the array for the results of the function
        IN NewArray BOOLEAN,             -- Use TRUE to clear a pre-existing array, FALSE appends new element
        IN EnvRef REFERENCE              -- Reference to Environment tree
    )
    BEGIN        
        IF NewArray THEN
            DELETE FIELD EnvRef.SplitterArrays.{ArrayName};
        END IF;
    
        DECLARE Element CHAR;
        DECLARE Remainder CHAR CompositeString;
    
        DECLARE SplitterArrayRef REFERENCE TO EnvRef.SplitterArrays.{ArrayName};
        IF NOT LASTMOVE(SplitterArrayRef) THEN
            CREATE LASTCHILD OF EnvRef.SplitterArrays AS SplitterArrayRef NAME ArrayName;
        END IF;
    
        WHILE LENGTH(Remainder) <> 0 DO
            IF POSITION(Delimiter IN Remainder) > 0 THEN
                DECLARE Element CHAR SUBSTRING(Remainder BEFORE Delimiter);
                IF LENGTH(Element) > 0 THEN
                    CREATE LASTCHILD OF SplitterArrayRef NAME 'Element' VALUE Element;
                END IF;
    
                SET Remainder = SUBSTRING(Remainder AFTER Delimiter);
            ELSE
                DECLARE Element CHAR Remainder;
                IF LENGTH(Element) > 0 THEN
                    CREATE LASTCHILD OF SplitterArrayRef NAME 'Element' VALUE Element;
                END IF;
    
                SET Remainder = '';
            END IF;
        END WHILE;
    END;
    

    SplitStringTrim

    修剪元素字符串中的前导和尾随空格。
    不添加空字符串。

    CREATE PROCEDURE SplitStringTrim(
        IN CompositeString CHAR,         -- Composite string that needs to be split
        IN Delimiter CHAR,               -- Delimiter to be used when splitting the string
        IN ArrayName CHAR,               -- Name of the array for the results of the function
        IN NewArray BOOLEAN,             -- Use TRUE to clear a pre-existing array, FALSE appends new element
        IN EnvRef REFERENCE              -- Reference to Environment tree
    )
    BEGIN        
        IF NewArray THEN
            DELETE FIELD EnvRef.SplitterArrays.{ArrayName};
        END IF;
    
        DECLARE Element CHAR;
        DECLARE Remainder CHAR TRIM(CompositeString);
    
        DECLARE SplitterArrayRef REFERENCE TO EnvRef.SplitterArrays.{ArrayName};
        IF NOT LASTMOVE(SplitterArrayRef) THEN
            CREATE LASTCHILD OF EnvRef.SplitterArrays AS SplitterArrayRef NAME ArrayName;
        END IF;
    
        WHILE LENGTH(Remainder) <> 0 DO
            IF POSITION(Delimiter IN Remainder) > 0 THEN
                DECLARE Element CHAR TRIM(SUBSTRING(Remainder BEFORE Delimiter));
                IF LENGTH(Element) > 0 THEN
                    CREATE LASTCHILD OF SplitterArrayRef NAME 'Element' VALUE Element;
                END IF;
    
                SET Remainder = SUBSTRING(Remainder AFTER Delimiter;
            ELSE
                DECLARE Element CHAR TRIM(Remainder);
                IF LENGTH(Element) > 0 THEN
                    CREATE LASTCHILD OF SplitterArrayRef NAME 'Element' VALUE Element;
                END IF;
    
                SET Remainder = '';
            END IF;
        END WHILE;
    END;
    

    SplitStringAddEmpty

    向 SplitterArray 添加空元素,确保至少有一个元素。
    保留空白。

    CREATE PROCEDURE SplitStringAddEmpty(
        IN CompositeString CHAR,         -- Composite string that needs to be split
        IN Delimiter CHAR,               -- Delimiter to be used when splitting the string
        IN ArrayName CHAR,               -- Name of the array for the results of the function
        IN NewArray BOOLEAN,             -- Use TRUE to clear a pre-existing array, FALSE appends new element
        IN EnvRef REFERENCE              -- Reference to Environment tree
    )
    BEGIN        
        IF NewArray THEN
            DELETE FIELD EnvRef.SplitterArrays.{ArrayName};
        END IF;
    
        DECLARE Element CHAR;
        DECLARE Remainder CHAR CompositeString;
        DECLARE EndsWithDelimiter BOOLEAN ENDSWITH(Remainder, Delimiter);
    
        DECLARE SplitterArrayRef REFERENCE TO EnvRef.SplitterArrays.{ArrayName};
        IF NOT LASTMOVE(SplitterArrayRef) THEN
            CREATE LASTCHILD OF EnvRef.SplitterArrays AS SplitterArrayRef NAME ArrayName;
        END IF;
    
        IF LENGTH(Remainder) = 0 THEN
            CREATE LASTCHILD OF SplitterArrayRef NAME 'Element' VALUE '';
        ELSE
            WHILE LENGTH(Remainder) <> 0 DO
                IF POSITION(Delimiter IN Remainder) > 0 THEN
                    CREATE LASTCHILD OF SplitterArrayRef NAME 'Element' VALUE SUBSTRING(Remainder BEFORE Delimiter);
    
                    SET Remainder = SUBSTRING(Remainder AFTER Delimiter);
                ELSE
                    CREATE LASTCHILD OF SplitterArrayRef NAME 'Element' VALUE Remainder;
    
                    SET Remainder = '';
                END IF;
            END WHILE;
    
            IF EndsWithDelimiter THEN
                CREATE LASTCHILD OF SplitterArrayRef NAME 'Element' VALUE '';
            END IF;
        END IF;
    END;
    

    SplitStringAddEmptyTrim

    向 SplitterArray 添加空元素,确保至少有一个元素。
    修剪元素字符串的前导和尾随空格。

    CREATE PROCEDURE SplitStringAddEmptyTrim(
        IN CompositeString CHAR,         -- Composite string that needs to be split
        IN Delimiter CHAR,               -- Delimiter to be used when splitting the string
        IN ArrayName CHAR,               -- Name of the array for the results of the function
        IN NewArray BOOLEAN,             -- Use TRUE to clear a pre-existing array, FALSE appends new element
        IN EnvRef REFERENCE              -- Reference to Environment tree
    )
    BEGIN        
        IF NewArray THEN
            DELETE FIELD EnvRef.SplitterArrays.{ArrayName};
        END IF;
    
        DECLARE Element CHAR;
        DECLARE Remainder CHAR TRIM(CompositeString);
        DECLARE EndsWithDelimiter BOOLEAN ENDSWITH(Remainder, Delimiter);
    
        DECLARE SplitterArrayRef REFERENCE TO EnvRef.SplitterArrays.{ArrayName};
        IF NOT LASTMOVE(SplitterArrayRef) THEN
            CREATE LASTCHILD OF EnvRef.SplitterArrays AS SplitterArrayRef NAME ArrayName;
        END IF;
    
        IF LENGTH(Remainder) = 0 THEN
            CREATE LASTCHILD OF SplitterArrayRef NAME 'Element' VALUE '';
        ELSE
            WHILE LENGTH(Remainder) <> 0 DO
                IF POSITION(Delimiter IN Remainder) > 0 THEN
                    CREATE LASTCHILD OF SplitterArrayRef NAME 'Element' VALUE TRIM(SUBSTRING(Remainder BEFORE Delimiter));
    
                    SET Remainder = SUBSTRING(Remainder AFTER Delimiter);
                ELSE
                    CREATE LASTCHILD OF SplitterArrayRef NAME 'Element' VALUE TRIM(Remainder);
    
                    SET Remainder = '';
                END IF;
            END WHILE;
    
            IF EndsWithDelimiter THEN
                CREATE LASTCHILD OF SplitterArrayRef NAME 'Element' VALUE '';
            END IF;
        END IF;
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 2017-12-08
      • 2011-11-28
      • 1970-01-01
      相关资源
      最近更新 更多