Non sono a conoscenza di alcun modo per acquisire il nome del file all'interno dei parametri di accesso. Come soluzione alternativa, invece di modificare i file originali è possibile utilizzare un preprocessore per aggiungere il nome del file al volo. Se avevi due file, dì file_1.csv
contenente a,b,1
e file_2.csv
contenente c,d,2
, potresti avere un piccolo script di shell come append_filename.sh
:
#!/bin/bash
while read line
do
printf "%s,%s\n" "${line}" "${1##*/}"
done < $1
che puoi verificare fa qualcosa di utile chiamando direttamente lo script:
$ ./append_filename.sh file_1.csv
a,b,1,file_1.csv
Puoi quindi definire la tua tabella esterna per chiamarla tramite il preprocessor
clausola, qualcosa come:
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.
Quindi il nome del file viene prelevato automaticamente:
select * from e42;
COL1 COL2 COL3 FILENAME
---------- ---------- ---------- ------------------------------
a b 1 file_1.csv
c d 2 file_2.csv
Ho rimosso il percorso della directory in modo da vedere solo il nome del file:puoi mantenere il percorso completo se preferisci, ma potrebbe non essere necessario e potrebbe rivelare i dettagli del sistema operativo a persone che possono solo interrogare la tabella. Prendere nota delle linee guida sulla sicurezza; L'ho mantenuto semplice qui usando una directory per tutto, ma dovresti mettere il preprocessore da qualche altra parte. E ovviamente questo presuppone una piattaforma Unix-y o strumenti GNU; qualcosa di simile dovrebbe essere possibile con un file batch se stai usando Windows.
Questo approccio alla lettura riga per riga sarà relativamente lento per file di grandi dimensioni; con un file di prova di 1,5 milioni di righe che aggiunge il nome del file ha impiegato circa 80 secondi sulla mia piattaforma. Altri strumenti integrati saranno più veloci; questa versione con sed
impiega poco più di un secondo per lo stesso file:
#!/bin/bash
sed -e 's!$!,'"${1##*/}"'!' $1
Potresti provare altre alternative come awk
anche; probabilmente dovresti testarne alcuni per vedere cosa funziona meglio (o abbastanza velocemente) nel tuo ambiente.