यदि आप डबल-कोट्स में संलग्न सभी फ़ील्ड के साथ इनपुट फ़ाइल प्राप्त कर सकते हैं (या पढ़ने के बाद इसका अनुवाद कर सकते हैं; मेरा रेगेक्स पर्याप्त अच्छा नहीं है) तो आप dbms_utility.comma_to_table
; फ़ील्ड को संलग्न करने की आवश्यकता है क्योंकि (जैसा कि बताया गया है यहां
) टोकन को मान्य वस्तु नाम होना चाहिए, इसलिए 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
यदि उन्हें उद्धृत नहीं किया गया है तो आप एक रेगेक्स ( से पैटर्न का उपयोग कर सकते हैं। यहाँ ):
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()
add जोड़ सकते हैं लगभग tab(i)
. दूसरी विधि टूट जाती है इसलिए थोड़ा समायोजन की आवश्यकता होगी...