Employee
Employee

Re: シート名を項目名として扱うロードスクリプト

サンプルのスクリプトを作成してみました。ODBCドライバを利用してExcelファイルにアクセスしてテーブル情報としてシート情報を取得し、その後にシートごとにロードを実行するような処理となっています。

実現されようとしている内容によって修正が必要にはなりますが、大まかな流れをご参考にして頂ければと思います。以下サンプルの使用方法についてご説明を記載させて頂きます。

1. 以下のリンク先からファイルをダウンロードします。(中にinput.xlsxとSample.qvwが含まれています。)

http://community.qlik.com/servlet/JiveServlet/downloadBody/8138-102-1-11249/Sheet.zip

2. input.xlsxをC:\Excelディレクトリ以下に保存します。

3. input.xlsxをデータソースとして以下の様に「Microsoft Excel Driver」のデータソースを作成します。(名称はinputとしています。)

img.png

4. Sample.qvwを任意のフォルダに配置して実行します。ロードスクリプトは以下の様になっています。

-----------------------

//Excelから抽出したデータの結果を纏めるテーブルを作成

Result:

Load * Inline

[Sheet1,Sheet2,Sheet3];

ODBC CONNECT TO [input;DBQ=C:\Excel\input.xlsx];

//SQLtablesステートメントでExcelのテーブル情報(=シート情報)を取得

tables:

SQLtables;

//Excelのテーブル(=シート)の数を取得して、シート数分ループ処理を実行

FOR i = 0 to NoOfRows('tables')-1

  //tablesのTABLE_NAME列からテーブル名(=シート名)を取得(列名に$が含まれるため、$をreplace関数で削除)

  LET sheetName = replace(peek('TABLE_NAME', i, 'tables'), '$','');

 //シート上のA列のデータを抽出してシート名の列にロード。(ロード先は最初に作成したResultテーブルにConcatenate)

  Concatenate(Result)

  LOAD A AS [$(sheetName)]

  FROM C:\Excel\input.xlsx(ooxml, no labels, table is [$(sheetName)]);

NEXT

-----------------------

5. シート名を列名として一つのテーブルに纏める処理としています。

img2.png