示例数据:
1, test, "xy, yz", dog, cat
2, test2, xy, fish, bear
正如您在上面所看到的,第二列可能会也可能不会用引号括起来,逗号作为字符串的一部分。
我只是试图找到一种方法来忽略引号中的逗号,如果有的话。 我使用UTL_FILE并且不能使用外部表,我知道我知道,但我不是那个做出决定的人。
我还没有“尝试过”任何东西,因为在这个特定的场景中我找不到任何可以尝试的东西。我有代码提取每个逗号之间的子串,但显然,将“xy,yz”拆分为2个单独的字符串。我已经能够通过使用“作为特定列的分隔符来使其在一行上工作,但是当下一行没有第二列的引号时,这就变得很糟糕。
答案 0 :(得分:3)
如果您可以使用双引号括起来的所有字段(或者可以在阅读后翻译它,我的正则表达式不够好)提供输入文件,您可以使用dbms_utility.comma_to_table
;这些字段需要被包含,因为(如所示here)标记必须是有效的对象名称,因此1
会导致错误。例如:
declare
file utl_file.file_type;
list varchar2(120);
tablen binary_integer;
tab dbms_utility.lname_array;
begin
file := utl_file.fopen('MY_DIR', 'test1.csv', 'R');
loop
begin
utl_file.get_line(file => file, buffer => list);
exception
when no_data_found then
exit;
end;
dbms_output.put_line('Raw list: ' || list);
dbms_utility.comma_to_table(list => list,
tablen => tablen, tab => tab);
for i in 1..tablen
loop
dbms_output.put_line('Column ' || i || ': '
|| replace(tab(i), '"'));
end loop;
end loop;
utl_file.fclose(file);
end;
/
给出:
Raw list: "1","test","xy, yz","dog","cat"
Column 1: 1
Column 2: test
Column 3: xy, yz
Column 4: dog
Column 5: cat
Raw list: "2","test2","xy","fish","bear"
Column 1: 2
Column 2: test2
Column 3: xy
Column 4: fish
Column 5: bear
Raw list: "3","test3","ab, cd","rabbit, rabbit","duck"
Column 1: 3
Column 2: test3
Column 3: ab, cd
Column 4: rabbit, rabbit
Column 5: duck
如果没有引用它们,那么你可以使用正则表达式(来自here的模式):
declare
file utl_file.file_type;
list varchar2(120);
pattern varchar2(15) := '("[^"]*"|[^,]+)';
c sys_refcursor;
i number;
f varchar2(20);
begin
file := utl_file.fopen('MY_DIR', 'test2.csv', 'R');
loop
begin
utl_file.get_line(file => file, buffer => list);
exception
when no_data_found then
exit;
end;
dbms_output.put_line('Raw list: ' || list);
open c for
select level as col,
regexp_substr(list, pattern, 1, rownum) split
from dual
connect by level <= length(regexp_replace(list, pattern)) + 1;
loop
fetch c into i, f;
exit when c%notfound;
dbms_output.put_line('Column ' || i || ': ' || replace(f, '"'));
end loop;
close c;
end loop;
utl_file.fclose(file);
end;
/
给出:
Raw list: 1,test,"xy, yz",dog,cat
Column 1: 1
Column 2: test
Column 3: xy, yz
Column 4: dog
Column 5: cat
Raw list: 2,test2,xy,fish,bear
Column 1: 2
Column 2: test2
Column 3: xy
Column 4: fish
Column 5: bear
Raw list: 3,test3,"ab, cd","rabbit, rabbit",duck
Column 1: 3
Column 2: test3
Column 3: ab, cd
Column 4: rabbit, rabbit
Column 5: duck
我不确定问题中是否显示字段之间是否有空格。如果是这样,第一种方法仍然有效,您可以在trim()
周围添加tab(i)
。第二种方法
分解所以需要一些调整......
答案 1 :(得分:0)
Oracle SQL Developer工具附带了一个支持CSV的数据导入向导。看看§ 5.34 of the manual。它可能比手动处理您的csv更容易。如果需要进行任何处理,您可以通过excel / perl进行处理。