【发布时间】:2014-10-31 06:35:15
【问题描述】:
我知道如何使用 utl_file 从文件中读取数据,但我遇到了以下数据的问题。我们不能假设哪个位置的数据会为空。我们该如何处理?
样本数据:apple|bat|cat|"dog | dog"||||eee||abc
预期输出:
col1:苹果
col2:bat
col3:猫
col4:狗狗
col5:
col6:
col7:
col8:eee
col9:
col10:abc
我尝试了下面的代码,但它没有处理空值
declare
list varchar2(3500) :='apple|bat|cat|"dog | dog"||||eee||abc';
pattern varchar2(20) := '(" [^"]*"|[^|]+)';
i number:=0;
j number;
f varchar2(3500);
c sys_refcursor;
begin
dbms_output.put_line('Raw list: ' || list);
open c for
select level as col,
trim(regexp_substr(replace(list,'|','|'), pattern, 1, rownum))split
from dual
connect by level <= length(regexp_replace(list, pattern)) + 1;
loop
fetch c into j, f;
exit when c%notfound;
dbms_output.put_line('Column ' || i || ': ' || replace(f, '"'));
i:=i+1;
end loop;
close c;
end;
我的输出低于预期,但我需要预期的输出。
原始列表:apple|bat|cat|"dog|dog"||||eee||abc
第 0 列:苹果
第 1 栏:蝙蝠
第 2 栏:猫
第 3 栏:狗
第 4 栏:狗
第 5 栏:eee
第 6 栏:abc
第 7 栏:
第 8 栏:
第 9 栏:
第 10 栏:
【问题讨论】:
-
我可以想到几种方法来解决这个问题:1) 状态机,2) 正则表达式,3) INSTR 和 SUBSTR。祝你好运。