Ik ben niet op de hoogte van een manier om de bestandsnaam vast te leggen binnen de toegangsparameters. Als tijdelijke oplossing kunt u, in plaats van de originele bestanden te wijzigen, een preprocessor gebruiken om de bestandsnaam direct toe te voegen. Als je twee bestanden had, zeg dan file_1.csv
met a,b,1
en file_2.csv
met c,d,2
, zou je een klein shellscript kunnen hebben zoals append_filename.sh
:
#!/bin/bash
while read line
do
printf "%s,%s\n" "${line}" "${1##*/}"
done < $1
die u kunt verifiëren, doet iets nuttigs door het script rechtstreeks aan te roepen:
$ ./append_filename.sh file_1.csv
a,b,1,file_1.csv
U kunt dan uw externe tabel definiëren om die aan te roepen via de preprocessor
clausule, zoiets als:
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.
Dan wordt de bestandsnaam automatisch opgehaald:
select * from e42;
COL1 COL2 COL3 FILENAME
---------- ---------- ---------- ------------------------------
a b 1 file_1.csv
c d 2 file_2.csv
Ik heb het directorypad gestript zodat je alleen de bestandsnaam ziet - je zou het volledige pad kunnen behouden als je wilt, maar dat is misschien niet nodig en kan OS-details onthullen aan mensen die alleen de tabel kunnen doorzoeken. Let op de beveiligingsrichtlijnen; Ik heb het hier eenvoudig gehouden door voor alles één map te gebruiken, maar je moet de preprocessor ergens anders plaatsen. En natuurlijk is dit uitgaande van een Unix-y-platform of GNU-tools; iets soortgelijks zou mogelijk moeten zijn met een batchbestand als je Windows gebruikt.
Deze aanpak regel voor regel lezen zal relatief traag zijn voor grote bestanden; met een testbestand van 1,5 miljoen rijen dat de bestandsnaam toevoegde, duurde het ongeveer 80 seconden op mijn platform. Andere ingebouwde tools zullen sneller zijn; deze versie met sed
duurt iets meer dan een seconde voor hetzelfde bestand:
#!/bin/bash
sed -e 's!$!,'"${1##*/}"'!' $1
Je zou een ander alternatief kunnen proberen, zoals awk
te; je zou er waarschijnlijk een paar moeten testen om te zien wat het beste (of snel genoeg) werkt in jouw omgeving.