Jeg er ikke bekendt med nogen måde at fange filnavnet inden for adgangsparametrene. Som en løsning kan du i stedet for at ændre de originale filer bruge en forprocessor til at tilføje filnavnet med det samme. Hvis du havde to filer, så sig file_1.csv
indeholdende a,b,1
og file_2.csv
indeholdende c,d,2
, du kunne have et lille shell-script som append_filename.sh
:
#!/bin/bash
while read line
do
printf "%s,%s\n" "${line}" "${1##*/}"
done < $1
som du kan bekræfte gør noget nyttigt ved at kalde scriptet direkte:
$ ./append_filename.sh file_1.csv
a,b,1,file_1.csv
Du kan derefter definere din eksterne tabel til at kalde det via preprocessor
klausul, noget som:
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.
Derefter hentes filnavnet automatisk:
select * from e42;
COL1 COL2 COL3 FILENAME
---------- ---------- ---------- ------------------------------
a b 1 file_1.csv
c d 2 file_2.csv
Jeg har fjernet biblioteksstien, så du kun kan se filnavnet - du kan beholde den fulde sti, hvis du foretrækker det, men det er måske ikke nødvendigt og kan afsløre OS-detaljer for folk, der kun kan forespørge i tabellen. Bemærk sikkerhedsretningslinjerne; Jeg har holdt det enkelt her ved at bruge én mappe til alt, men du bør placere forprocessoren et andet sted. Og selvfølgelig forudsætter dette en Unix-y-platform eller GNU-værktøjer; noget lignende burde være muligt med en batch-fil, hvis du bruger Windows.
Denne tilgang til at læse linje for linje vil være relativt langsom for store filer; med en testfil på 1,5 millioner rækker ved at tilføje filnavnet tog det omkring 80 sekunder på min platform. Andre indbyggede værktøjer vil være hurtigere; denne version med sed
tager lidt over et sekund for den samme fil:
#!/bin/bash
sed -e 's!$!,'"${1##*/}"'!' $1
Du kan prøve andre alternativer såsom awk
også; du skal nok teste et par stykker for at se, hvad der fungerer bedst (eller hurtigt nok) i dit miljø.