Nie znam żadnego sposobu na przechwycenie nazwy pliku w parametrach dostępu. Jako obejście, zamiast modyfikować oryginalne pliki, możesz użyć preprocesora, aby dołączyć nazwę pliku w locie. Jeśli masz dwa pliki, powiedz file_1.csv
zawierające a,b,1
i file_2.csv
zawierające c,d,2
, możesz mieć mały skrypt powłoki, taki jak append_filename.sh
:
#!/bin/bash
while read line
do
printf "%s,%s\n" "${line}" "${1##*/}"
done < $1
który możesz sprawdzić, robi coś przydatnego, wywołując skrypt bezpośrednio:
$ ./append_filename.sh file_1.csv
a,b,1,file_1.csv
Następnie możesz zdefiniować swoją zewnętrzną tabelę, aby wywołać ją za pomocą preprocessor
klauzula, coś w stylu:
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.
Następnie nazwa pliku jest pobierana automatycznie:
select * from e42;
COL1 COL2 COL3 FILENAME
---------- ---------- ---------- ------------------------------
a b 1 file_1.csv
c d 2 file_2.csv
Usunąłem ścieżkę do katalogu, więc widzisz tylko nazwę pliku – możesz zachować pełną ścieżkę, jeśli wolisz, ale może to nie być konieczne i może ujawnić szczegóły systemu operacyjnego osobom, które mogą tylko przeszukiwać tabelę. Zwróć uwagę na wytyczne dotyczące bezpieczeństwa; Utrzymałem to w prosty sposób, używając jednego katalogu do wszystkiego, ale powinieneś umieścić preprocesor w innym miejscu. I oczywiście zakłada to platformę Unix-y lub narzędzia GNU; coś podobnego powinno być możliwe z plikiem wsadowym, jeśli używasz systemu Windows.
Takie podejście do czytania wiersz po wierszu będzie stosunkowo powolne w przypadku dużych plików; z plikiem testowym zawierającym 1,5 miliona wierszy dołączenie nazwy pliku zajęło mi około 80 sekund na mojej platformie. Inne wbudowane narzędzia będą szybsze; ta wersja z sed
zajmuje nieco ponad sekundę dla tego samego pliku:
#!/bin/bash
sed -e 's!$!,'"${1##*/}"'!' $1
Możesz wypróbować inną alternatywę, taką jak awk
też; prawdopodobnie będziesz musiał przetestować kilka, aby zobaczyć, co działa najlepiej (lub wystarczająco szybko) w Twoim środowisku.