यदि आपके पास संलग्न क्षेत्रों में कभी पाइप नहीं थे तो आप इसे नियंत्रण फ़ाइल से कर सकते थे। यदि आपके पास एक फ़ील्ड के भीतर दोनों पाइप और डबल-कोट्स हो सकते हैं तो मुझे लगता है कि आपके पास फ़ाइलों को प्रीप्रोसेस करने के अलावा कोई विकल्प नहीं है, दुर्भाग्य से।
आपका समाधान [1], डबल-कोट्स को बदलने के लिए SQL ऑपरेटर के साथ , उपयोगी होने में बहुत देर हो रही है; डिलीमीटर और एनक्लोजर की व्याख्या पहले ही SQL*Loader द्वारा की जा चुकी है, इससे पहले कि वह SQL चरण करता है। आपका समाधान [2], बाड़े को अनदेखा करने के लिए, [1] के साथ संयोजन में काम करेगा - जब तक कि किसी एक फ़ील्ड में पाइप वर्ण न हो। और समाधान [3] में वैसी ही समस्याएं हैं जैसे वैश्विक स्तर पर [1] और/या [2] का उपयोग करना।
डिलीमीटर निर्दिष्ट करने के लिए दस्तावेज़ीकरण उल्लेख करता है कि:
दूसरे शब्दों में, यदि आप दोहरा उद्धरण अंदर . दोहराते हैं फ़ील्ड तो वे बच जाएंगे और तालिका डेटा में दिखाई देंगे। जैसा कि आप डेटा पीढ़ी को नियंत्रित नहीं कर सकते हैं, आप बची हुई डबल कोट्स के साथ सभी डबल-कोट्स को बदलने के लिए प्राप्त फाइलों को प्रीप्रोसेस कर सकते हैं। सिवाय आप सभी को बदलना नहीं चाहते उनमें से - जो वास्तव में वास्तविक बाड़े हैं, उनसे बचना नहीं चाहिए।
प्रासंगिक वर्णों को लक्षित करने के लिए आप नियमित अभिव्यक्ति का उपयोग कर सकते हैं दूसरों को छोड़ देंगे। मेरा मजबूत क्षेत्र नहीं है, लेकिन मुझे लगता है कि आप इसे आगे की ओर देखें और दावे के पीछे देखें के साथ ऐसा कर सकते हैं। ।
अगर आपके पास orig.txt
called नाम की कोई फ़ाइल थी युक्त:
"1"|A|"B"|"C|D"
"2"|A|"B"|"C"D"
3|A|""B""|"C|D"
4|A|"B"|"C"D|E"F"G|H""
आप यह कर सकते थे:
perl -pe 's/(?<!^)(?<!\|)"(?!\|)(?!$)/""/g' orig.txt > new.txt
यह एक डबल-कोट की तलाश करता है जो लाइन-स्टार्ट एंकर या पाइप कैरेक्टर से पहले नहीं होता है; और उसके बाद पाइप कैरेक्टर या लाइन एंड एंकर नहीं है; और केवल उन लोगों को प्रतिस्थापित करता है जो बच निकले (दोगुने) डबल-कोट्स वाले हैं। जो new.txt
. बना देगा इसमें शामिल हैं:
"1"|A|"B"|"C|D"
"2"|A|"B"|"C""D"
3|A|"""B"""|"C|D"
4|A|"B"|"C""D|E""F""G|H"""
फ़ील्ड के प्रारंभ और अंत में दोहरे उद्धरणों को संशोधित नहीं किया गया है, लेकिन बीच वाले अब बच गए हैं। यदि आपने उसे डबल-कोट संलग्नक वाली नियंत्रण फ़ाइल के साथ लोड किया है:
load data
truncate
into table t42
fields terminated by '|' optionally enclosed by '"'
(
col1,
col2,
col3,
col4
)
तब आप के साथ समाप्त होगा:
select * from t42 order by col1;
COL1 COL2 COL3 COL4
---------- ---------- ---------- --------------------
1 A B C|D
2 A B C"D
3 A "B" C|D
3 A B C"D|E"F"G|H"
जो उम्मीद से आपके मूल डेटा से मेल खाता है। ऐसे किनारे के मामले हो सकते हैं जो काम नहीं करते हैं (जैसे डबल-कोट के बाद पाइप भीतर a फ़ील्ड) लेकिन किसी और के डेटा की व्याख्या करने के लिए आप क्या कर सकते हैं इसकी एक सीमा है... बेशक बेहतर रेगुलर एक्सप्रेशन पैटर्न (बहुत) भी हो सकते हैं।
आप एक बाहरी तालिका SQL*Loader के बजाय, यदि डेटा फ़ाइल Oracle निर्देशिका में है (या हो सकती है) और आपके पास सही अनुमतियाँ हैं। आपको अभी भी फ़ाइल को संशोधित करना है, लेकिन आप इसे preprocessor
निर्देश, SQL*Loader को कॉल करने से पहले स्पष्ट रूप से ऐसा करने की आवश्यकता के बजाय।