行による複数のテーブルの結合ご挨拶、
私は非常に単純なはずのコードで十分長い間頭を殴っていました。
複数のExcelファイルとシートから開いたテーブルを取得し、Excelシートに対応する名前の列を持つ幅の広いテーブルに結合したいと思います。
私の場合、列は次のようになります。
| TestWB1Sheet1の列1 |
TestWB1Sheet1の列2 |
TestWB1Sheet1の列3 |
TestWB1Sheet2の列1 |
..。 |
TestWB2Sheet4の列3 |
1つの落とし穴は、各Excelファイルの最後のシート(私の例ではsheet5)からデータをアップロードしたくないということです。
このディスカッションのコードを使用してみましたが、名前が正しくないようです。 https://community.jmp.com/t5/Discussions/Joining-Multiple-Data-Table-using-a-loop/mp/9451
答えはこの議論にあると思いますが、コードが無関係であるため、解決策を理解するのは難しいです。
https://community.jmp.com/t5/Discussions/Joining-multiple-DataTables-and-retaining-column-name/mp/18874#M17198
これは、列に正しく名前を付けない単純化されたコードです。
Names Default to Here(1);
//Close All is a convienience script to use while writing the script
//Close All(Data Tables, NoSave);
//Create list of files to open
file = Pick File("Pick file/files", "$Desktop", {"All Files|*"}, 1,0, "", multiple);
//create blank list of data tables
dtList = {};
//Open list of files to dtList
for (i=1, i<=nitems(file), i++,
ws = Get Excel Worksheets(file[i]);
sws = ws[1::(N Items(ws) - 1)];
show(i);
for (s=1, s<=nitems(sws), s++,
show(s);
dt = Open(file[i],
Worksheets( sws[s] ),
use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 2 ),
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( "-" )
)
);
dt << Set Name(char(i)||char(s));
insert into (dtList, dt);
)
);
//Designate dt_old to hold the joined data
dt_old = data table(dtList[1]);
//Join all tables in dtList to dt_old by row number
for ( i = 2, i <= N Items( dtList ), i++,
dt_new = data table(dtList[i]);
join_name = "Limits" || char(i);
show(i);
show(dt_new);
dt_old << Join( With (dt_new),
By Row Number,
Output Table( join_name )
);
show(dt_old);
close(dt_old, nosave);
dt_old = data table(join_name);
);
助けてくれてありがとう。
スクリプティングRe:行ごとに複数のテーブルを結合する
Names Default To Here(1);
//directory with files
xlsx_files = Files In Directory("./WB");
//dt collection list
dt_list = {};
For Each({file}, xlsx_files,
//open datatables one by one
dt = Open(
"WB/" || file,
Worksheets({"Sheet1", "Sheet2", "Sheet3", "Sheet4"}),
Use for all sheets(1),
Concatenate Worksheets(1),
Create Concatenation Column(1),
Worksheet Settings(
1,
Has Column Headers(1),
Number of Rows in Headers(1),
Headers Start on Row(1),
Data Starts on Row(2),
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("-")
)
);
//add table name to SourceTable column
Column(dt, "Source Table") << Set Each Value(Word(1, file, ".") || :"Source Table");
//add to dtlist
Insert Into(dt_list, dt);
);
//concatenate
For(i = 2, i <= N Items(dt_list), i++,
dt_list[1] << Concatenate(dt_list[i], "Append to first table");
Close(dt_list[i], no save);
);
//split
dt = dt_list[1] << Split(
Split By(:Source Table),
Split(:Col1, :Col2, :Col3),
Sort by Column Property
);
//Close(dt_list[1], no save);
- ディレクトリ内のすべてのファイルを取得します(不要なファイルがある場合は削除する必要があります)
- リストに挿入しながらxlsxファイルをループします
- すべてのファイルを1つのjmpデータテーブルに連結します
- データテーブルを分割する
連結する前のテーブル:

連結後:

分割後:

Re:行ごとに複数のテーブルを結合するこれが、すべての新しい列を作成し、それらを結合するためのコードの変更です。
列の名前を変更するには、JSLの簡単な部分を追加する必要がありました。残りのコードはすべて正常に機能しました。
Names Default To Here( 1 );
//Close All is a convienience script to use while writing the script
//Close All(Data Tables, NoSave);
//Create list of files to open
file = Pick File( "Pick file/files", "$Desktop", {"All Files|*"}, 1, 0, "", multiple );
//create blank list of data tables
dtList = {};
//Open list of files to dtList
For( i = 1, i <= N Items( file ), i++,
ws = Get Excel Worksheets( file[i] );
sws = ws[1 :: (N Items( ws ) - 1)];
Show( i );
For( s = 1, s <= N Items( sws ), s++,
Show( s );
dt = Open(
file[i],
Worksheets( sws[s] ),
use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 2 ),
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( "-" )
)
);
dt << Set Name( Char( i ) || Char( s ) );
Insert Into( dtList, dt );
// set new column names
currFileName = Word( -2, File[i], ".\/" );
For( k = 1, k <= N Cols( dt ), k++,
Column( dt, k ) << set name(
Column( dt, k ) << get name || " of " || currFileName || sws[s]
)
);
);
);
//Designate dt_old to hold the joined data
dt_old = Data Table( dtList[1] );
//Join all tables in dtList to dt_old by row number
For( i = 2, i <= N Items( dtList ), i++,
dt_new = Data Table( dtList[i] );
join_name = "Limits" || Char( i );
Show( i );
Show( dt_new );
dt_old << Join( With( dt_new ), By Row Number, Output Table( join_name ) );
Show( dt_old );
Close( dt_old, nosave );
dt_old = Data Table( join_name );
);