アクセスパラメータ内のファイル名をキャプチャする方法を知りません。回避策として、元のファイルを変更するのではなく、プリプロセッサを使用してその場でファイル名を追加することができます。ファイルが2つある場合は、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
ディレクトリパスを削除したので、ファイル名のみが表示されます。必要に応じてフルパスを保持できますが、それは必要ない場合があり、テーブルのクエリのみを実行できるユーザーにOSの詳細を公開できます。セキュリティガイドラインに注意してください。ここでは、すべてに1つのディレクトリを使用することでシンプルにしていますが、プリプロセッサは別の場所に配置する必要があります。そしてもちろん、これはUnix-yプラットフォームまたはGNUツールを想定しています。 Windowsを使用している場合は、バッチファイルでも同様のことが可能です。
行ごとに読み取るこのアプローチは、大きなファイルの場合は比較的遅くなります。 150万行のテストファイルでファイル名を追加すると、私のプラットフォームでは約80秒かかりました。他の組み込みツールはより高速になります。 sed
を使用したこのバージョン 同じファイルで1秒強かかります:
#!/bin/bash
sed -e 's!$!,'"${1##*/}"'!' $1
awk
などの他の方法を試すこともできます それも;おそらく、ご使用の環境で何が最適に(または十分に高速に)機能するかを確認するために、いくつかのテストを行う必要があります。