Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
お世話になります。
Qlikviewでエクセルファイルを取り込み、ファイル名とシート名を項目として取得をしたいです。
ファイル名はFilename()でいけるのですが、シート名の取得方法がわかりません。
ご教授頂ければと思います。
よろしくお願いします。
QV内の関数のみで取得する場合は、取り込みタイミング等、限定される状況がありそうですが、以下のような方法をとれば取得可能なケースはあります。
//サンプル:::::::::::::::::::::::::::
//テーブル名は記述せずに取得します。これによりQV側が自動的にシート名をテーブル名にします。
NoConcatenate
LOAD 項目A,
項目B
FROM
[サンプルファイル.xlsx]
(ooxml, embedded labels, table is テーブルA);
//NoOfTables関数で取得した取得済みテーブル数を使って、最後に取得したテーブル名を取得します。
LET V_TableName = chr(91)&TableName(NoOfTables()-1)&chr(93);
//変数に入れたテーブル名をJOINします。
Left Join ($(V_TableName))
LOAD '$(V_TableName)' as シート名A
AutoGenerate(1);
添付ファイルでは、テーブルA、テーブルB、テーブルC、テーブルDを読み込んで、同一レイアウトのテーブルB、CやResident句で再読込したときにきちんと動作するか確認してみたのですが、本来テーブルDとなるはずのテーブル名が正しく取得できていませんでした。
以上のように、スクリプトの配置箇所によっては問題が発生する可能性があるので、ご注意下さい。
該当ファイル取り込み前にODBC接続してSQLTABLESステートメントでシート名を取り出しておいて、このシート名を利用してデータを取り込むようにすれば、シート名とひもづける事ができました。
//サンプル ::::::::::::::::::::::::::::::::::::::::::::::::::
ODBC CONNECT32 TO [Excel Files;DBQ=C:\Users\............\サンプルファイル.xls]; //ファイルのフルパスを入れてください
TEMP:
SQLTABLES;
LET V_Rows = NoOfRows('TEMP');
FOR i = 1 to $(V_Rows)
LET V_SheetName = Peek('TABLE_NAME',$(i)-1,'TEMP');
LET V_TableName = chr(91)&PurgeChar('$(V_SheetName)','$')&chr(93);
$(V_TableName):
LOAD *,
TextBetween('$(V_TableName)',chr(91),chr(93)) as シート名
FROM
[C:\Users\...............\サンプルファイル.xls] //ファイルのフルパスを入れてください
(biff, embedded labels, table is '$(V_SheetName)');
NEXT
DROP Fields DATA_SOURCE, REMARKS, TABLE_CAT, TABLE_NAME, TABLE_SCHEM, TABLE_TYPE;
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'TEMP:' と 'SQLTABLES;' の記述行にエラーのラインが表示されますが、これは気にしなくても大丈夫です。