행별로 여러 테이블 조인인사말,
나는 아주 간단해야 하는 코드로 충분히 오랫동안 머리를 굴려왔다.
여러 Excel 파일 및 시트에서 열린 테이블을 가져 와서 Excel 시트에 해당하는 이름의 열이 있는 넓은 테이블에 결합하고 싶습니다.
제 경우에는 열이 아래와 같이 표시되어야 합니다.
| TestWB1Sheet1의 1열 |
TestWB1Sheet1의 2열 |
TestWB1Sheet1의 3열 |
TestWB1Sheet2의 1열 |
... |
TestWB2Sheet4의 3열 |
한 가지 문제는 각 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 파일을 반복합니다.
- 모든 파일을 하나의 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 );
);