前回のブログ投稿でJMP と Excel - 終わりのない物語? - パート1最後に、階層ヘッダーと結合されたセルを含むスプレッドシートをインポートする例を示しました。 今回は、多くのワークシートを含むスプレッドシート ファイルをインポートすることと、(特定のフォルダーにある) 複数のスプレッドシートを JMP に読み取ることに焦点を当てます。 複雑にしすぎたくないので、スプレッドシート内の構造名とパラメータ名は、異なるワークシート内でも同じであると仮定します。
(注: 同じでない場合は、各ワークブックの設定を指定し、別のテーブルとしてインポートする必要があります。 これらを後で結合するには、結合/連結機能または JMP データ テーブルの JMP クエリ ビルダーを使用します。 この種の手順を自動化したい場合は、通常、読み込むすべての変数、ワークシート、ファイルの役割をチェックするためにさらにスクリプトを作成する必要があります)。
複数のワークシート - インポートと自動化
それでは、まず Excel のデータを見てみましょう。

さまざまなワークブックがすべて同じ形状と単純ではない構造を持っていることがわかります。 赤い下線で、各ワークブックの異なるバッチ番号を確認できます。 データを読み取りたいのですが、別のテーブルでは読み取りたくありません。 むしろ、単一のテーブルが必要ですが、JMP の Excel インポート ウィザードを使用すると、これを非常に簡単に実現できます。
- Excel シートを任意の JMP ウィンドウにドラッグすると、Excel インポート ウィザードが開きます。

- 必要に応じて、ヘッダーおよびデータ フィールドの設定を変更します。 データに含めたくないヘッダーがあり、実際のヘッダーは 4 行目から始まり 3 行にわたっています。 次に、空のフィールドが含まれる行があります。 したがって、データを 1 行後 (7 行ではなく 8 行目) から開始します。 最初の列には分析用のデータがないため、スキップします。

- 「次へ」ボタンをクリックすると、最終行設定を使用して、タイムスタンプ情報を含めたくないことを伝えることができます。 データが終了する行を選択してプラス (+) 記号を押すと、どの行番号が正しいかを気にする必要はありません。

- 残りの作業は、すべてのワークシート内で同じ構造を使用することです。 「すべてのワークシートに使用」と「ワークシートを連結して列の一致を試みる」マーカーをチェックできます。 これにより、プレビューが 30/30 行から 90/90 行に変更されます。 3 つのワークシートのそれぞれに 30 行があることを考えると、これは期待どおりに機能するようです。 連結するときは、「連結時にワークシート名を使用して列を作成する」フラグもオンにすることを強くお勧めします。 そうしないと、後でデータがどこから来たのかを反映するのが難しくなります。
- 最後のステップはインポートです。もちろん、インポートされたデータを常にチェックします。
これを実際に見てみたい場合は、これをお勧めします短いビデオ(JMP 12 を使用)。 インポート ウィザードの使用を開始したばかりの場合の注意事項: インポート ウィザードでは最後の設定が保存されるため、新しい異なるデータをインポートするときに、データの表示が予期せぬものになる可能性があります。 「デフォルト設定に戻す」ボタンを使用すると、ウィザードの設定をリセットできます。
インポートされた各データ テーブルには、以前に選択した設定でインポートをやり直すためのソース スクリプトがあります。 これにより、スプレッドシートに新しいバッチ データを取得した場合に、更新されたデータ テーブルを読み取ることができます。 まあ、データを頻繁に収集する場合は、スプレッドシートではなくデータベースの使用を検討するでしょうが、それは別の話です。
複数のスプレッドシートのインポートを自動化する - さまざまな課題
これで、同じ構造を持つ複数のワークシートを含む 1 つのスプレッドシートを JMP に読み込む方法がわかりました。 ただし、「同じ構造を持つ複数のスプレッドシートをファイルごとに手動で (つまり自動的に) 行わずに、JMP に読み込むにはどうすればよいか」という課題にも直面したことがあるかもしれません。 短い答えは、JMP スクリプト言語を使用することです。 ソース スクリプトをベースとして使用すると、スプレッドシートごとにこのスクリプトを再実行するか、フォルダー内のすべてのファイルをループする for ループを使用できます。 File Exchange コミュニティで共有されているスクリプトがあり、(おそらくいくつかの調整を加えて) 使用できます。これはまさにこれを実行します。複数のtxtファイルまたはcsvファイルを結合する
つまり、次の手順を実行します (スクリプトの一部のみを示します)。
- ディレクトリを選択し、Excel ファイルであるファイルをフィルタリングします。
prefilepath = munger(Pick Directory( "Browse to the Directory of the Target Excel Files " ),1,"/","");
filepath = Convert File Path( prefilepath, Windows );
prefilelist = Files In Directory( filepath );
n2=nitems(prefilelist);
//filter out any non-Excel files
For( i2 = 1, n2 >= i2, i2++,
file=(prefilelist[i2]);
If( Item( 2, prefilelist[i2], "." ) == "xls" | Item( 2, prefilelist[i2], "." ) == "xlsx",
Insert Into( filelist,file),
//show(file)
)
);
- ファイルをループしてインポートします。 メモリを節約するには、2 つのみを開いて最初にインポートされたテーブルを新しいテーブルで更新し、後者を閉じて次のテーブルを開きます。 そうしないと、使用されるウィンドウ ハンドルの数や使用されるメモリ (多数または非常に大きなスプレッドシートの場合) が原因で、Windows で問題が発生する可能性があります。
n=nitems(filelist); //number of items in the working list
cctable= New Table( "Combined data table");//make an empty table
ExcelSheetName = "Sheet1"; // change this if you have a special sheet name you want to read the data from
//Iterate through building the SQL string to query the Excel files
For( i = 1, i < n+1, i++,
filenow = ( filelist[i] );
fileopen=(filepath||filenow);
dt=open(fileopen, Worksheets( ExcelSheetName ) );
dt << New Column( "File Name", formula( filenow ) );
cctable << Concatenate( Data Table( dt ), Append to first table );
Close( dt, NoSave );
);//end of for loop
ここまで、簡単な構造化データをインポートするいくつかの方法と、JMP の Excel インポート ウィザードを使用して階層データ セットやマージされたデータ セットを処理する方法について説明しました。 最後に、複数のワークシートを一度にインポートする方法と、JSL スクリプトを使用して複数の Excel シートを自動的に読み取る方法を示しました。 次回の投稿では、データの形式などに基づいた潜在的な課題について説明します。
あなたのコメントや経験の共有を楽しみにしています。