問題
複数ファイルのインポートを使用せずに、ディレクトリ内のファイルを使用してデータテーブルを連結する
解決
ディレクトリ内のファイルを使用してリストを作成し、連結してそれらをまとめます。
// make a test directory
dt = New Table( "Untitled", Add Rows( 1 ), New Column( "a" ), New Column( "b" ) );
path = "$TEMP/test/";
Delete Directory( path ); // Be careful! This will delete your files!
Create Directory( path );
For( i = 1, i <= 3, i += 1,
dt:a = i; // make each table a little different
dt:b = 10 * i;
dt << save( path || Char( 1000 + i ) ); // make the table names sort
);
Close( dt, nosave );
// here's the code to open and concatenate...
namelist = Files In Directory( path );
Sort List Into( namelist ); // not really needed?
dtlist = {}; // hold the opened, hidden, tables here
While( N Items( filename = Remove From( namelist, 1 /*first item*/ ) ) == 1,
filename = filename[1]; // {dt} -> dt
filename = path || filename; // prepend path name
// inserts opened table at end of dtlist
Insert Into( dtlist, Open( filename, invisible ) );
);
rememberdt = dtlist; // need these later to close the hidden tables
firstdt = Remove From( dtlist, 1/*first item*/ )[1]; // need one to start
If( N Items( dtlist ), // concatenate needs more than one table
resultdt = firstdt << Concatenate( dtlist, Create source column )
, // subset returns a fresh table, like concatenate, so both cases have same behavior
resultdt = firstdt << Subset( All rows, Selected columns only( 0 ) )
);
// clean up the hidden tables
While( N Items( closedt = Remove From( rememberdt ) ) == 1, Close( closedt[1], nosave ) );
// clean up new table
resultdt << setname( "all my tables" );
resultdt << deletetableproperty( "Source" ); // from subset or concatenate
//
Print( "done", resultdt );
議論
JMP 14 では複数ファイルのインポートが導入されています。 @ウー一部のテーブル属性が保持されていないことに気付きました。 (JMP 15 は改善されるはずですが、まだ利用できません。)
この例の最初の部分では、DeleteDirectory と CreateDirectory を使用して、テスト用のサンプル ファイルのクリーンなセットを作成します。 前回の試行で JMP テーブルがまだ開いている場合、DeleteDirectory が失敗することがあります。テーブルが非表示になっている場合でも、テーブル ウィジェットを使用してテーブルを手動で閉じることができます。
Click the table icon beside the widget to open the hidden tableClick the table icon beside the widget to open the hidden tableウィジェットの横にあるテーブルアイコンをクリックして、非表示のテーブルを開きます
同じコードで、ファイル名に 1000 を追加して、ファイル名を適切に並べ替えます ( 1,10,2,3,4,5,6,7,8,9 ではありません)。 パス変数の末尾にはスラッシュがあるため、他の場所にスラッシュを追加する必要はありません。
名前リストはディレクトリ内のファイルによって初期化されます。 dtlist は空のリストに初期化されます。 名前は名前リストから 1 つずつ削除され、開かれます (非表示になります)。 開いたテーブルは 1 つずつ dtlist に保存されます。 (これはテーブルへの単なるポインターまたはハンドルであり、テーブルの内容ではありません。)
次に、dtlist 項目が複数ある場合、concatenate によってそれらの項目から新しいテーブルが作成されます。 (concatenate がテーブルのリストを受け入れることがわかってうれしかったです。) テーブルが 1 つしかない場合、subset はコピーを作成します。 コピーを作成すると、連結と同様に未保存のテーブルが作成されるため、結果はどちらの場合も同様になります。
クリーンアップでは、非表示のテーブルが削除され、結果テーブルの名前が変更され、結果からソース スクリプトが削除されます。 ソース スクリプトを保存しておくとよいでしょう。 この例では最後にディレクトリの削除を使用することもできますが、実際のソース ファイルに対してそれを行うのはおそらく悪い考えです。
関連項目
ディレクトリ内のファイル
データテーブルの連結
MFI の弱点である複数の Excel ファイルをインポートするための非常に優れたスニペットです。
また、MFI では不可能な、列数がわずかに異なるファイルをブルート フォースで連結する場合にも役立ちます。
Open() を使用するときにさらにオプションを指定することもできます。これにより、ヘッダー行が 2 行ある Excel ファイルをインポートすることができました。
While( N Items( filename = Remove From( namelist, 1 /*first item*/ ) ) == 1,
filename = filename[1]; // {dt} -> dt
filename = path || filename; // prepend path name
// inserts opened table at end of dtlist
Insert Into( dtlist, Open( filename, invisible, Worksheets( "MyWorksheet" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 2 ),
Headers Start on Row( 1 ),
Data Starts on Row( 3 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
) ) );
);
ここに新しいユーザーがいますが、多くの複数のセットからデータを統合しようとするときに、これが非常に役立つことがわかりました。 ありがとう!