Nevím o žádném způsobu, jak zachytit název souboru v rámci přístupových parametrů. Jako náhradní řešení můžete místo úpravy původních souborů použít preprocesor k připojení názvu souboru za chodu. Pokud jste měli dva soubory, řekněte file_1.csv
obsahující a,b,1
a file_2.csv
obsahující c,d,2
, můžete mít malý shell skript jako append_filename.sh
:
#!/bin/bash
while read line
do
printf "%s,%s\n" "${line}" "${1##*/}"
done < $1
který můžete ověřit, že dělá něco užitečného přímým voláním skriptu:
$ ./append_filename.sh file_1.csv
a,b,1,file_1.csv
Poté můžete definovat svou externí tabulku, která ji bude volat prostřednictvím preprocessor
klauzule, něco jako:
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.
Poté se automaticky vybere název souboru:
select * from e42;
COL1 COL2 COL3 FILENAME
---------- ---------- ---------- ------------------------------
a b 1 file_1.csv
c d 2 file_2.csv
Odstranil jsem cestu k adresáři, takže vidíte pouze název souboru - můžete si ponechat úplnou cestu, pokud chcete, ale to nemusí být nutné a mohlo by to odhalit podrobnosti o OS lidem, kteří mohou pouze dotazovat tabulku. Všimněte si bezpečnostních pokynů; Zjednodušil jsem to zde použitím jednoho adresáře pro všechno, ale preprocesor byste měli umístit jinam. A to samozřejmě za předpokladu platformy Unix-y nebo nástrojů GNU; něco podobného by mělo být možné s dávkovým souborem, pokud používáte Windows.
Tento přístup čtení řádku po řádku bude u velkých souborů relativně pomalý; s testovacím souborem s 1,5 miliony řádků a připojením názvu souboru trvalo na mé platformě asi 80 sekund. Ostatní vestavěné nástroje budou rychlejší; tato verze s sed
trvá jen něco málo přes sekundu pro stejný soubor:
#!/bin/bash
sed -e 's!$!,'"${1##*/}"'!' $1
Můžete zkusit jinou alternativu, jako je awk
také; pravděpodobně budete muset několik otestovat, abyste viděli, co ve vašem prostředí funguje nejlépe (nebo dostatečně rychle).