Не ми е известен начин за заснемане на името на файла в рамките на параметрите за достъп. Като заобиколно решение, вместо да модифицирате оригиналните файлове, можете да използвате препроцесор, за да добавите името на файла в движение. Ако сте имали два файла, кажете file_1.csv
съдържащ a,b,1
и file_2.csv
съдържащ c,d,2
, можете да имате малък шел скрипт като append_filename.sh
:
#!/bin/bash
while read line
do
printf "%s,%s\n" "${line}" "${1##*/}"
done < $1
който можете да проверите, че прави нещо полезно, като извикате директно скрипта:
$ ./append_filename.sh file_1.csv
a,b,1,file_1.csv
След това можете да дефинирате вашата външна таблица, за да я извикате чрез preprocessor
клауза, нещо като:
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.
След това името на файла се избира автоматично:
select * from e42;
COL1 COL2 COL3 FILENAME
---------- ---------- ---------- ------------------------------
a b 1 file_1.csv
c d 2 file_2.csv
Премахнах пътя към директорията, така че виждате само името на файла - можете да запазите пълния път, ако предпочитате, но това може да не е необходимо и може да разкрие подробности за операционната система на хора, които могат само да запитват таблицата. Обърнете внимание на указанията за сигурност; Тук съм го опростил, като използвам една директория за всичко, но трябва да поставите препроцесора някъде другаде. И разбира се, това предполага Unix-y платформа или GNU инструменти; нещо подобно трябва да е възможно с пакетен файл, ако използвате Windows.
Този подход четене ред по ред ще бъде сравнително бавен за големи файлове; с тестов файл от 1,5 милиона реда, добавящ името на файла, отне около 80 секунди на моята платформа. Други вградени инструменти ще бъдат по-бързи; тази версия с sed
отнема малко повече от секунда за същия файл:
#!/bin/bash
sed -e 's!$!,'"${1##*/}"'!' $1
Можете да опитате друга алтернатива като awk
също; вероятно ще трябва да тествате няколко, за да видите кое работи най-добре (или достатъчно бързо) във вашата среда.