मुझे एक्सेस पैरामीटर के भीतर फ़ाइल नाम कैप्चर करने के किसी भी तरीके से अवगत नहीं है। वर्कअराउंड के रूप में, मूल फ़ाइलों को संशोधित करने के बजाय आप फ़्लाई पर फ़ाइल नाम जोड़ने के लिए प्रीप्रोसेसर का उपयोग कर सकते हैं। अगर आपके पास दो फ़ाइलें थीं, तो file_1.csv
say कहें a,b,1
. युक्त और file_2.csv
जिसमें c,d,2
. है , आपके पास एक छोटी शेल स्क्रिप्ट हो सकती है जैसे append_filename.sh
:
#!/bin/bash
while read line
do
printf "%s,%s\n" "${line}" "${1##*/}"
done < $1
जिसे आप सत्यापित कर सकते हैं कि स्क्रिप्ट को सीधे कॉल करके कुछ मददगार होता है:
$ ./append_filename.sh file_1.csv
a,b,1,file_1.csv
फिर आप अपनी बाहरी तालिका को preprocessor
. के माध्यम से कॉल करने के लिए परिभाषित कर सकते हैं खंड, कुछ इस तरह:
create table e42 (
col1 varchar2(10),
col2 varchar2(10),
col3 number,
filename varchar2(30)
)
organization external (
type oracle_loader
default directory d42
access parameters (
records delimited by newline
preprocessor 'append_filename.sh'
fields terminated by ','
)
location ('file_1.csv', 'file_2.csv')
);
Table E42 created.
फिर फ़ाइल का नाम अपने आप उठा लिया जाता है:
select * from e42;
COL1 COL2 COL3 FILENAME
---------- ---------- ---------- ------------------------------
a b 1 file_1.csv
c d 2 file_2.csv
मैंने निर्देशिका पथ को हटा दिया है ताकि आप केवल फ़ाइल नाम देख सकें - यदि आप चाहें तो आप पूरा पथ रख सकते हैं, लेकिन यह आवश्यक नहीं हो सकता है और उन लोगों को ओएस विवरण प्रकट कर सकता है जो केवल तालिका से पूछ सकते हैं। सुरक्षा दिशानिर्देशों पर ध्यान दें; मैंने सब कुछ के लिए एक निर्देशिका का उपयोग करके इसे सरल रखा है, लेकिन आपको प्रीप्रोसेसर को कहीं और रखना चाहिए। और निश्चित रूप से यह एक यूनिक्स-वाई मंच या जीएनयू उपकरण मान रहा है; यदि आप Windows का उपयोग कर रहे हैं तो बैच फ़ाइल के साथ भी कुछ ऐसा ही संभव होना चाहिए।
लाइन-दर-लाइन पढ़ने का यह तरीका बड़ी फ़ाइलों के लिए अपेक्षाकृत धीमा होगा; फ़ाइल नाम जोड़ने वाली 1.5 मिलियन-पंक्ति परीक्षण फ़ाइल के साथ मेरे प्लेटफ़ॉर्म पर लगभग 80 सेकंड लगे। अन्य अंतर्निर्मित उपकरण तेज़ होंगे; sed
. के साथ यह संस्करण एक ही फ़ाइल के लिए बस एक सेकंड से अधिक समय लगता है:
#!/bin/bash
sed -e 's!$!,'"${1##*/}"'!' $1
आप अन्य विकल्प जैसे awk
. आज़मा सकते हैं भी; आपके वातावरण में सबसे अच्छा (या पर्याप्त तेज़) क्या काम करता है, यह देखने के लिए आपको शायद कुछ परीक्षण करने की आवश्यकता होगी।