Saya tidak mengetahui cara apa pun untuk menangkap nama file dalam parameter akses. Sebagai solusinya, daripada memodifikasi file asli, Anda dapat menggunakan praprosesor untuk menambahkan nama file dengan cepat. Jika Anda memiliki dua file, ucapkan file_1.csv
mengandung a,b,1
dan file_2.csv
mengandung c,d,2
, Anda dapat memiliki skrip shell kecil seperti append_filename.sh
:
#!/bin/bash
while read line
do
printf "%s,%s\n" "${line}" "${1##*/}"
done < $1
yang dapat Anda verifikasi melakukan sesuatu yang bermanfaat dengan memanggil skrip secara langsung:
$ ./append_filename.sh file_1.csv
a,b,1,file_1.csv
Anda kemudian dapat menentukan tabel eksternal Anda untuk memanggilnya melalui preprocessor
klausa, seperti:
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.
Kemudian nama file diambil secara otomatis:
select * from e42;
COL1 COL2 COL3 FILENAME
---------- ---------- ---------- ------------------------------
a b 1 file_1.csv
c d 2 file_2.csv
Saya telah menghapus jalur direktori sehingga Anda hanya melihat nama file - Anda dapat menyimpan jalur lengkap jika Anda mau, tetapi itu mungkin tidak diperlukan dan dapat mengungkapkan detail OS kepada orang-orang yang hanya dapat menanyakan tabel. Perhatikan pedoman keamanan; Saya membuatnya sederhana di sini dengan menggunakan satu direktori untuk semuanya, tetapi Anda harus meletakkan praprosesor di tempat lain. Dan tentu saja ini mengasumsikan platform Unix-y atau alat GNU; sesuatu yang serupa dapat dilakukan dengan file batch jika Anda menggunakan Windows.
Pendekatan ini membaca baris demi baris akan relatif lambat untuk file besar; dengan file uji 1,5 juta baris yang menambahkan nama file membutuhkan waktu sekitar 80 detik di platform saya. Alat bawaan lainnya akan lebih cepat; versi ini dengan sed
membutuhkan lebih dari satu detik untuk file yang sama:
#!/bin/bash
sed -e 's!$!,'"${1##*/}"'!' $1
Anda bisa mencoba alternatif lain seperti awk
juga; Anda mungkin perlu menguji beberapa untuk melihat apa yang terbaik (atau cukup cepat) di lingkungan Anda.