我需要创建一个函数来接受任意长度的sting输入并返回一个字符串数组,每个字符串包含n个长块。例如,具有3个字符长块的This is a test
输入应该返回:
Thi
s i
s a
tes
t
我已经创建了以下功能。我的问题是,是否有更好,更快的方法来解决这个问题?我知道可以使用很长的字符串多次调用此函数,我不希望这可能会减慢系统速度。另外,我最初需要设置该功能,以便在检测到分隔符时也创建一个新条目。例如,“块长度”为3:
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;
我的具体问题是:对于LARGE字符串输入,有更快的方法吗?
答案 0 :(得分:2)
我不知道这是否更快,但绝对更简单。您实际上并没有将数据块放在数组中,而是在每个分隔符或一组字符后插入换行符。这可以使用正则表达式轻松完成。
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,'||(length-2)||'}'||delimiter||')|(.{'||(length)||'})'