Jag är inte medveten om något sätt att fånga filnamnet inom åtkomstparametrarna. Som en lösning kan du istället för att modifiera originalfilerna använda en förprocessor för att lägga till filnamnet direkt. Om du hade två filer, säg file_1.csv
som innehåller a,b,1
och file_2.csv
som innehåller c,d,2
, kan du ha ett litet skalskript som append_filename.sh
:
#!/bin/bash
while read line
do
printf "%s,%s\n" "${line}" "${1##*/}"
done < $1
som du kan verifiera gör något användbart genom att anropa skriptet direkt:
$ ./append_filename.sh file_1.csv
a,b,1,file_1.csv
Du kan sedan definiera din externa tabell för att anropa den via preprocessor
klausul, något i stil med:
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.
Då plockas filnamnet upp automatiskt:
select * from e42;
COL1 COL2 COL3 FILENAME
---------- ---------- ---------- ------------------------------
a b 1 file_1.csv
c d 2 file_2.csv
Jag har tagit bort katalogsökvägen så att du bara ser filnamnet - du kan behålla hela sökvägen om du föredrar det, men det kanske inte är nödvändigt och kan avslöja OS-detaljer för personer som bara kan fråga i tabellen. Observera säkerhetsriktlinjerna; Jag har gjort det enkelt här genom att använda en katalog för allt, men du bör placera förprocessorn någon annanstans. Och naturligtvis förutsätter detta en Unix-y-plattform eller GNU-verktyg; något liknande borde vara möjligt med en batchfil om du använder Windows.
Denna metod att läsa rad för rad kommer att vara relativt långsam för stora filer; med en testfil på 1,5 miljoner rader som lade till filnamnet tog det cirka 80 sekunder på min plattform. Andra inbyggda verktyg kommer att vara snabbare; denna version med sed
tar drygt en sekund för samma fil:
#!/bin/bash
sed -e 's!$!,'"${1##*/}"'!' $1
Du kan prova andra alternativ som awk
för; du skulle förmodligen behöva testa några för att se vad som fungerar bäst (eller tillräckligt snabbt) i din miljö.