Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
こんにちは。ロードスクリプトに関する質問です。
エクセルファイル読込について質問させてください。
Excelの拡張子がxlsの場合はスクリプトが(biff, embedded ・・・・・
xlsxの場合は(ooxml, embedded・・・・・
xlsとxlsxのエクセルが多数保管されているフォルダに接続し、
全エクセルを一気に読込みたいと考えております。
xlsとxlsx、の両者とも読込めるスクリプトを記述したいのですが、
良い方法をご教示頂けますと幸いです。
よろしくお願いいたします。
以下のようにファイルリストを取得してテーブルを作成し、
拡張子によって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;
きちんと取得したいシート名と項目名がそろっているのなら
以下の内容でとりこめます。
※レイアウトが一致していれば「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);
早速ありがとうございます。
私の質問が悪かったのですが、
201301.xls
201302.xls
201303.xls
201304.xls
201401.xlsx
201403.xlsx
201501.xlsx
201506.xlsx
上記のエクセルがフォルダに保管されていて
201301~201303まで項目が同じ、201304から項目が変わります。
こういったケースにおいて、なるべく短いスクリプトにしたいです。
まず、私の知っている限りでは、拡張子 '.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;
以下のようにファイルリストを取得してテーブルを作成し、
拡張子によって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;
Set Errormodeというものを初めて知りました。使ってみたいと思います。
タイムリーにご回答頂き、ありがとうございました。