Informix 4gl拆分字符串或字符

时间:2015-05-14 08:00:23

标签: variables split informix 4gl

我想知道Informix 4gl命令来拆分变量 比如

lv_var = variable01;variable02

lv_var01 = variable01
lv_var02 = variable02

Informix 4gl中是否有可以执行此操作的内容。

在python中,我可以做到

lv_array = lv_var.split(";")

并使用数组中的变量

3 个答案:

答案 0 :(得分:1)

使用经典的Informix 4gl可以实现这样的......

define
    p_list      dynamic array of char(10)

main
    define
        i       smallint,
        cnt     smallint,
        p_str   char(500)

    let p_str = "a;b;c;d"
    let cnt = toarray(p_str, ";")

    for i = 1 to cnt
        display p_list[i]
    end for

end main

function toarray(p_str, p_sep)
    define
        p_str   char(2000),
        p_sep   char(1),
        i       smallint,
        last    smallint,
        ix      smallint,
        p_len   smallint

    let ix = 0
    let p_len = length(p_str)

    # -- get size of array needed
    for i = 1 to p_len
        if p_str[i] = p_sep then
            let ix = ix + 1
        end if
    end for

    if ix > 0 then
        # -- we have more then one
        allocate array p_list[ix + 1]

        let ix = 1
        let last = 1
        for i = 1 to p_len
            if p_str[i] = p_sep then
                let p_list[ix] = p_str[last,i-1]
                let ix = ix + 1
                let last = i + 1
            end if
        end for
        # -- set the last one
        let p_list[ix] = p_str[last, p_len]
    else
        # -- only has one
        allocate array p_list[1]
        let ix = 1
        let p_list[ix] = p_str
    end if

    return ix

end function

输出:

a
b
c
d

动态阵列支持需要IBM Informix 4GL 7.32.UC1或更高版本

答案 1 :(得分:0)

没有标准功能可以做到这一点。一个主要问题是返回数组。我可能会编写一个C函数来完成这项工作,但在I4GL中,它看起来像:

FUNCTION nth_split_field(str, c, n)
    DEFINE str VARCHAR(255)
    DEFINE c   CHAR(1)
    DEFINE n   INTEGER

    ...code to find nth field delimited by c in str...

END FUNCTION

答案 2 :(得分:0)

您会发现,多年来已经成长为超级Informix 4GL的产品,例如FourJs Genero,将添加内置方法,以简化Informix 4GL开发人员的生活。

如果您升级到Genero

,那么这样的事情就可以满足您的需求
-- Example showing how string can be parsed using string tokenizer

-- New features added to Genero since Informix 4gl used include
-- STRING - like a CHAR but length does not need to be specified -  http://www.4js.com/online_documentation/fjs-fgl-manual-html/?path=fjs-fgl-manual#c_fgl_datatypes_STRING.html
-- DYNAMIC ARRAY like an ARRAY but does not need to have length specified.  Is also passed by reference to functions - http://www.4js.com/online_documentation/fjs-fgl-manual-html/?path=fjs-fgl-manual#c_fgl_Arrays_010.html
-- base.StringTokenizer - methods to split a string - http://www.4js.com/online_documentation/fjs-fgl-manual-html/?path=fjs-fgl-manual#c_fgl_ClassStringTokenizer.html

MAIN

DEFINE arr DYNAMIC ARRAY OF STRING
DEFINE i INTEGER

    CALL string2array("abc;def;ghi",arr,";")

    -- display result
    FOR i = 1 TO arr.getLength()
        DISPLAY arr[i]
    END FOR

    -- Should display
    --abc
    --def
    --ghi

END MAIN


FUNCTION string2array(s,a,delimiter)
DEFINE s STRING 
DEFINE a DYNAMIC ARRAY OF STRING
DEFINE delimiter STRING

DEFINE tok base.StringTokenizer

    CALL a.clear()
    LET tok = base.StringTokenizer.create(s,delimiter)
    WHILE tok.hasMoreTokens()
        LET a[a.getLength()+1] = tok.nextToken()
    END WHILE
    -- a is DYNAMIC ARRAY so has been pased by reference and does not need to be explicitly returned
END FUNCTION