Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle SQL-Loader मूल्यों में कुशलतापूर्वक आंतरिक दोहरे उद्धरणों को संभालता है

यदि आपके पास संलग्न क्षेत्रों में कभी पाइप नहीं थे तो आप इसे नियंत्रण फ़ाइल से कर सकते थे। यदि आपके पास एक फ़ील्ड के भीतर दोनों पाइप और डबल-कोट्स हो सकते हैं तो मुझे लगता है कि आपके पास फ़ाइलों को प्रीप्रोसेस करने के अलावा कोई विकल्प नहीं है, दुर्भाग्य से।

आपका समाधान [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 को कॉल करने से पहले स्पष्ट रूप से ऐसा करने की आवश्यकता के बजाय।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle 10g Webapp में JAXB 2

  2. स्तंभ का सटीक मान प्राप्त करने के लिए SQL क्वेरी

  3. ora-12154 हल नहीं कर सका... oracle तत्काल क्लाइंट के साथ

  4. ग्रोवी ओरेकल संग्रहित प्रक्रिया - अमान्य स्तंभ अनुक्रमणिका

  5. SQL कथनों में स्थानीय संग्रह प्रकारों की अनुमति नहीं है