Qlik Community

Japan

Announcements
Submit your remarkable customer story for the Global Transformation Awards at QlikWorld Denver 2022. SUBMIT A STORY
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

xlsとxlsxをロードするスクリプト

こんにちは。ロードスクリプトに関する質問です。

エクセルファイル読込について質問させてください。

Excelの拡張子がxlsの場合はスクリプトが(biff, embedded ・・・・・

           xlsxの場合は(ooxml, embedded・・・・・

xlsとxlsxのエクセルが多数保管されているフォルダに接続し、

全エクセルを一気に読込みたいと考えております。

xlsとxlsx、の両者とも読込めるスクリプトを記述したいのですが、

良い方法をご教示頂けますと幸いです。

よろしくお願いいたします。

Labels (1)
1 Solution

Accepted Solutions
hka
Employee
Employee

以下のようにファイルリストを取得してテーブルを作成し、

拡張子によってLOAD文を変更するというのでは如何でしょうか。

シート名は同じという形で記述してます。

 

項目が変わるのは、LOAD文で * を使用することで対応できます。

ただし、項目が変わるので別テーブル扱いになります。

(最初のテーブルを読み込ませてConcatenateすれば1テーブルにできます。

 

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

FileTable:

LOAD Distinct

  FileName() as FileName

FROM

フォルダ名\*.xlsx

(ooxml, embedded labels, table is Sheet1);

 

LOAD Distinct

  FileName() as FileName

FROM

フォルダ名\*.xlsx

(biff, embedded labels, table is Sheet1$);

 

 

  for n = 0 to (NoOfRows('FileTable')-1)

    LET vFile = Peek('FileName',$(n),'FileTable');

    LET vExt = chr(39)&subfield(Peek('FileName',$(n),'FileTable'),'.',2)&chr(39);

 

 

    if $(vExt)='xls' then

     LOAD

      *

     FROM

     $(vFile)

     (biff, embedded labels, table is Sheet1$);

   ELSE

     LOAD

      *

     FROM

     $(vFile)

     (ooxml, embedded labels, table is Sheet1);

    ENDIF

  next n;

View solution in original post

5 Replies
kentaroWakamatsu
Creator II
Creator II

きちんと取得したいシート名と項目名がそろっているのなら

以下の内容でとりこめます。

※レイアウトが一致していれば「Concatenate(table)」は省略可

【サンプル1】

table:

LOAD A,

     B

FROM

(biff, embedded labels, table is Sheet1$);

Concatenate(table)

LOAD A,

     B

FROM

(ooxml, embedded labels, table is Sheet1);

Not applicable
Author

早速ありがとうございます。

私の質問が悪かったのですが、

201301.xls

201302.xls

201303.xls

201304.xls

201401.xlsx

201403.xlsx

201501.xlsx

201506.xlsx

上記のエクセルがフォルダに保管されていて

201301~201303まで項目が同じ、201304から項目が変わります。

こういったケースにおいて、なるべく短いスクリプトにしたいです。

kentaroWakamatsu
Creator II
Creator II

まず、私の知っている限りでは、拡張子 '.xlsx' と '.xls' は、別で記載する必要があると思います。

同一拡張子のファイルの中で、項目名が違うケースがあり、それらを同じ意味合いの一つの項目名に

統合するということであれば、項目名のパターンごとにスクリプトを用意しテーブルをまとめるしかないと思います。

(ただし、列の位置が一緒であれば、列見出しを「なし」にしてヘッダーサイズを調整することでまとめる事は可能です)

ただこの場合は、項目が無いファイルを開いた際にエラーがかかるので、これを無視する記載が記載が必要です。

下記例は、「Set Errormode = 0;」 で一旦エラーを無視する状態にし、最後に「Set Errormode = 1;」でエラーモードを

戻しています

【スクリプト例】

Set Errormode = 0;

table:

LOAD A,

     B

FROM

(biff, embedded labels, table is Sheet1$);

Concatenate

LOAD A,

     B

FROM

(ooxml, embedded labels, table is Sheet1);

Concatenate

LOAD C as A,

     D as B

FROM

(biff, embedded labels, table is Sheet1$);

Concatenate

LOAD C as A,

     D as B

FROM

(ooxml, embedded labels, table is Sheet1);

Set Errormode = 1;

hka
Employee
Employee

以下のようにファイルリストを取得してテーブルを作成し、

拡張子によってLOAD文を変更するというのでは如何でしょうか。

シート名は同じという形で記述してます。

 

項目が変わるのは、LOAD文で * を使用することで対応できます。

ただし、項目が変わるので別テーブル扱いになります。

(最初のテーブルを読み込ませてConcatenateすれば1テーブルにできます。

 

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

FileTable:

LOAD Distinct

  FileName() as FileName

FROM

フォルダ名\*.xlsx

(ooxml, embedded labels, table is Sheet1);

 

LOAD Distinct

  FileName() as FileName

FROM

フォルダ名\*.xlsx

(biff, embedded labels, table is Sheet1$);

 

 

  for n = 0 to (NoOfRows('FileTable')-1)

    LET vFile = Peek('FileName',$(n),'FileTable');

    LET vExt = chr(39)&subfield(Peek('FileName',$(n),'FileTable'),'.',2)&chr(39);

 

 

    if $(vExt)='xls' then

     LOAD

      *

     FROM

     $(vFile)

     (biff, embedded labels, table is Sheet1$);

   ELSE

     LOAD

      *

     FROM

     $(vFile)

     (ooxml, embedded labels, table is Sheet1);

    ENDIF

  next n;

View solution in original post

Not applicable
Author

Set Errormodeというものを初めて知りました。使ってみたいと思います。

タイムリーにご回答頂き、ありがとうございました。