繁体   English   中英

ORACLE PL-SQL如何创建函数以分割字符串并将n长的“块”返回到数组中?

[英]ORACLE PL-SQL how to create function to split a string and return n-long “chunks” into an array?

我需要创建一个函数,该函数将接受任意长度的字符串输入,并返回每个包含n个长块的字符串数组。 例如,输入“ This is a test具有3个字符长的块This is a test应返回:

Thi
s i
s a
tes
t   

我已经创建了以下功能。 我的问题是,是否可能有更好,更快的方法来解决此问题? 我知道可以使用很长的字符串多次调用此函数,并且我不想这样做可能减慢系统速度。 另外,我最终需要设置功能,以便在检测到分隔符时也创建一个新条目。 例如,“块长度”为三个:

Testing with comma delimiters, one, two, three, test

应该返回:

Tes
tin
g w
ith
co
mma
del
imi
ter
s,
one
,
two
,
thr
ee,
te
st 

注意,我不希望删除或替换定界符本身。 检测到后,我只是填充了一个新的行/新数组条目。

到目前为止,这是我的代码:

CREATE OR REPLACE FUNCTION SPLIT_STRING (
    p_str   VARCHAR2, --String to split
    p_del   VARCHAR2, --Delimiter
    p_len   INTEGER,  --Length of each chunk
    p_force NUMBER) --Forces split when length is reached (1=on, 0=off)
RETURN VARCHAR2 IS
    l_tmp_str   VARCHAR2(32767);
    l_chnk_len  INTEGER;
    l_str       VARCHAR2(32767);
    l_chunk     VARCHAR2(32767);
    l_pos       INTEGER;
    l_len       INTEGER;
    l_chnksize  NUMBER;
BEGIN
    --Determine the strings total length
    l_len:= LENGTH(p_str);
    IF (l_len > 0)
    THEN
        l_tmp_str:= p_str;

        --Determine the necessary number of chuncks
        l_chnksize:=(l_len/p_len);
        IF MOD(l_chnksize,1) != 0
        THEN
            l_chnksize:= CEIL(l_chnksize);
        END IF;

        --Split the string into chunks
        IF p_force = 1
        THEN
            l_pos:=1;    
            FOR loop_num IN 1..l_chnksize
            LOOP
                IF (loop_num>1)
                THEN
                    l_str:=l_str||CHR(10)||CHR(13)||SUBSTR(p_str,l_pos,p_len);
                ELSE
                    l_str:=SUBSTR(p_str,l_pos,p_len);
                END IF;

                --Increment position placeholder
                l_pos:=l_pos+p_len;
            END LOOP;
        ELSE
            l_str:='UNFORCED, NOT IMPLEMENTED'; 
        END IF;
    END IF;

--Return the delimited string
RETURN l_str;

我的具体问题是:对于大型字符串输入,是否有更快的方法?

我不知道这是否更快,但绝对简单。 您实际上并不是将这些块放入数组中,而是在每个定界符或一组字符之后插入换行符。 使用正则表达式可以轻松完成此操作。

select regexp_replace('Testing with comhm,a sdfdeli,mitjers,one,two,three,test',
                      '(.{0,3},)|(.{5})',
                      '\1\2' ||chr(10))     chunks
from dual;

CHUNKS
-------
Testi
ng wi
th co
mhm,
a sdf
deli,
mitje
rs,
one,
two,
three
,
test

正则表达式说明:

  • (。{0,3},) :最多由3个字符组成,后跟一个逗号(定界符),假设每个块的长度为5。
  • (。{5}) :5个字符的组,假定每个块的长度为5。

这些第一和第二捕获组被替换为自己,并附加了换行符。

通用表达式是

'(.{0,'||(length-2)||'}'||delimiter||')|(.{'||(length)||'})'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM