저는 2일 동안 올바른 형식으로 Excel에서 데이터를 JMP로 가져오는 데 어려움을 겪었습니다.
저는 수백 개의 엑셀 시트를 가지고 있지만, 데이터가 정리되지 않았습니다. 엑셀 시트에는 서로 옆에 많은 테이블이 있습니다(수백 개).
저는 여러 테이블에 걸쳐 데이터를 쌓고 싶지만, 연관된 헤더 데이터로 새 열을 만들고 싶습니다. 저는 한 테이블에서만 이것을 달성할 수 있었고, 모든 테이블이나 다른 엑셀 문서의 시트에서 복제할 수 없습니다. 시트는 또한 다른 탭 이름을 갖는 경향이 있지만, 하나의 엑셀 문서에서만 작동하도록 할 수 있다면 매우 좋을 것입니다.
제공하신 엑셀 파일을 조금 더 간단하게 수정했지만, 더 복잡하더라도 아이디어는 여전히 동일할 것입니다. 워크시트 하나만 다루겠지만, 시트를 반복하는 것은 쉽습니다.
시작 데이터
JMP로 가져오기(어떤 이유에서인지 JMP가 내가 그렇게 하라고 지시하지 않았는데도 첫 번째 빈 열을 삭제하려고 하지만 괜찮습니다)
우리의 시작 데이터
이 시점에서 저는 즉시 JSL을 사용할 것이지만 JMP의 대화형 기능을 사용하여 쉽게 정리할 수 있습니다. 이 솔루션은 데이터의 다양한 유형의 문제(헤더 누락, 중복된 매개변수)를 처리하지 않는다는 점에 유의하세요. 해당 문제에 대해 무엇을 해야 할지 모르기 때문입니다.
Names Default To Here(1);
dt =Open("$DOWNLOADS/Book1.xlsx",
Worksheets("Sheet1"),
Use for all sheets(0),
Concatenate Worksheets(0),
Create Concatenation Column(0),
Worksheet Settings(1,
Has Column Headers(0),
Number of Rows in Headers(1),
Headers Start on Row(1),
Data Starts on Row(1),
Data Starts on Column(1),
Data Ends on Row(0),
Data Ends on Column(0),
Replicated Spanned Rows(0),
Replicated Spanned Headers(0),
Suppress Hidden Rows(0),
Suppress Hidden Columns(0),
Suppress Empty Columns(0),
Treat as Hierarchy(0),
Multiple Series Stack(0),
Import Cell Colors(0),
Limit Column Detect(1),
Column Separator String("-"),
Column Numeric Format(Index(0),Column Name(Column 1), Datatype("Character"))));// turn everything after this into functions/expressions which you can easily run on different sheets// Take only useful data: header which belongs to parameters (first two rows)// Parameter rows
header_rows =[1,2];
param_rows = dt << Get Rows Where(Starts With(:Column 1,"Parameter"));
dt_headers = dt << subset(Rows(header_rows), Selected Columns(0), Output table("Data Header"));
dt_params = dt << subset(Rows(param_rows), Selected Columns(0), Output table("Data Parametere"));Close(dt, no save);// Drop empty columnsFor Each({colname}, dt_params << Get Column Names("String"),If(Col Number(Column(dt_params, colname))==0,
dt_params << Delete Column(colname)););
dt_result = dt_params << Stack(
columns(dt_params << Get Column Names("String")),
Stack By Row(0),
Drop All Other Columns(1),
Number of Series(2),
Output Table("Result"));// Close(dt_params, no save);// Cleanup some columns
dt_result << Delete Columns(1,3);Column(dt_result,1)<< Set Name("Name");Column(dt_result,2)<< Set Name("Value");// Add grouping for header joining
new_col = dt_result << New Column("Group", Numeric, Ordinal, Formula(Col Cumulative Sum(1,:Name)));
dt_result << run formulas;
new_col << Delete Formula;
headers = dt_headers[1,0];
header_count =N Items(Associative Array(headers));
dt_headerstack =Eval(EvalExpr(dt_headers << Stack(
columns(dt_headers << Get Column Names("String")),
Stack By Row(0),
Number of Series(Expr(header_count)),
Output Table("header stack"))));// Close(dt_headers, no save);// drop unnecessary columns
dt_headerstack << Delete Columns(1::N Cols(dt_headerstack)::2);// Move header columns and remove extra header rows
dt_headerstack << Move Up;
rows_to_delete = dt_headerstack << Get Rows Where(Starts With(Column(dt_headerstack,1)[],"Header"));
dt_headerstack << Delete Rows(rows_to_delete);// Add grouping for update
new_col = dt_headerstack << New Column("Group", Numeric, Ordinal, Formula(Row()));
dt_headerstack << run formulas;
new_col << Delete Formula;
dt_result << Update(
With(dt_headerstack),
Match Columns(:Group =:Group));Close(dt_headerstack, no save);Close(dt_headers, no save);// close earlierClose(dt_params, no save);// close earlierClose(dt, no save);// close earlier/*
sheetList = Get Excel Worksheets("$DOWNLOADS/Book1.xlsx"); // for sheet list to loop over
*/
물론입니다. 더미 데이터를 첨부했습니다. 최대 200개의 표가 나란히 있을 수 있고, 탭 이름이 변경되는 것을 보여주기 위해 동일한 Excel 파일 내에 다른 워크시트를 추가했지만, 실제로 이러한 시트는 종종 폴더 내의 별도의 Excel 시트에 있습니다. 노란색 하이라이트는 새로운 헤더가 필요한 곳이라고 생각하고, 주황색 하이라이트는 실제 데이터 세트에서 이 데이터가 그 아래에서 시작되기 전에 수백 개의 빈 행이 있기 때문에 있습니다.
이상적으로는 모든 매개변수(매개변수 1~19, 엑셀에서 아래로 스크롤하면 더 많은 매개변수가 있음)를 매개변수 헤더 아래에, 값은 값 헤더 아래에 두고, 원래 게시물에서처럼 열을 추가하여 이 데이터가 헤더1/2/3(그리고 새로운 4) 값에 속한다는 것을 보여주고 싶습니다.
궁극적으로 두 개의 데이터 세트(VCL과 VL 헤더 열)도 header1/2/3(그리고 4)의 식별자와 비슷하게 저장하려고 합니다.
솔직히 말해서, 이건 끔찍한 포맷의 데이터라서 쉽지 않을 겁니다. 출처로 가서 거기서 데이터를 수정하는 게 가장 좋은 선택이겠지만, 그럴 수 있는 경우는 드뭅니다.
가능한 한 원시 데이터를 JMP로 가져오는 것으로 시작하겠습니다. 다음과 같습니다.
그리고 여기서부터 스크립트를 작성하기 시작할 것입니다. 이 데이터는 JSL을 사용하지 않고는 처리하기에는 너무 많은 문제가 있기 때문입니다(JSL 없이도 꽤 멀리 갈 수 있겠지만 JSL을 사용하면 훨씬 쉬울 것입니다). 헤더의 첫 번째 줄을 수정하는 것이 가장 먼저 시작해야 할 작업일 것입니다. 그러면 "테이블"과 해당 데이터를 더 쉽게 분리할 수 있습니다.
원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.
제공하신 엑셀 파일을 조금 더 간단하게 수정했지만, 더 복잡하더라도 아이디어는 여전히 동일할 것입니다. 워크시트 하나만 다루겠지만, 시트를 반복하는 것은 쉽습니다.
시작 데이터
JMP로 가져오기(어떤 이유에서인지 JMP가 내가 그렇게 하라고 지시하지 않았는데도 첫 번째 빈 열을 삭제하려고 하지만 괜찮습니다)
우리의 시작 데이터
이 시점에서 저는 즉시 JSL을 사용할 것이지만 JMP의 대화형 기능을 사용하여 쉽게 정리할 수 있습니다. 이 솔루션은 데이터의 다양한 유형의 문제(헤더 누락, 중복된 매개변수)를 처리하지 않는다는 점에 유의하세요. 해당 문제에 대해 무엇을 해야 할지 모르기 때문입니다.
Names Default To Here(1);
dt =Open("$DOWNLOADS/Book1.xlsx",
Worksheets("Sheet1"),
Use for all sheets(0),
Concatenate Worksheets(0),
Create Concatenation Column(0),
Worksheet Settings(1,
Has Column Headers(0),
Number of Rows in Headers(1),
Headers Start on Row(1),
Data Starts on Row(1),
Data Starts on Column(1),
Data Ends on Row(0),
Data Ends on Column(0),
Replicated Spanned Rows(0),
Replicated Spanned Headers(0),
Suppress Hidden Rows(0),
Suppress Hidden Columns(0),
Suppress Empty Columns(0),
Treat as Hierarchy(0),
Multiple Series Stack(0),
Import Cell Colors(0),
Limit Column Detect(1),
Column Separator String("-"),
Column Numeric Format(Index(0),Column Name(Column 1), Datatype("Character"))));// turn everything after this into functions/expressions which you can easily run on different sheets// Take only useful data: header which belongs to parameters (first two rows)// Parameter rows
header_rows =[1,2];
param_rows = dt << Get Rows Where(Starts With(:Column 1,"Parameter"));
dt_headers = dt << subset(Rows(header_rows), Selected Columns(0), Output table("Data Header"));
dt_params = dt << subset(Rows(param_rows), Selected Columns(0), Output table("Data Parametere"));Close(dt, no save);// Drop empty columnsFor Each({colname}, dt_params << Get Column Names("String"),If(Col Number(Column(dt_params, colname))==0,
dt_params << Delete Column(colname)););
dt_result = dt_params << Stack(
columns(dt_params << Get Column Names("String")),
Stack By Row(0),
Drop All Other Columns(1),
Number of Series(2),
Output Table("Result"));// Close(dt_params, no save);// Cleanup some columns
dt_result << Delete Columns(1,3);Column(dt_result,1)<< Set Name("Name");Column(dt_result,2)<< Set Name("Value");// Add grouping for header joining
new_col = dt_result << New Column("Group", Numeric, Ordinal, Formula(Col Cumulative Sum(1,:Name)));
dt_result << run formulas;
new_col << Delete Formula;
headers = dt_headers[1,0];
header_count =N Items(Associative Array(headers));
dt_headerstack =Eval(EvalExpr(dt_headers << Stack(
columns(dt_headers << Get Column Names("String")),
Stack By Row(0),
Number of Series(Expr(header_count)),
Output Table("header stack"))));// Close(dt_headers, no save);// drop unnecessary columns
dt_headerstack << Delete Columns(1::N Cols(dt_headerstack)::2);// Move header columns and remove extra header rows
dt_headerstack << Move Up;
rows_to_delete = dt_headerstack << Get Rows Where(Starts With(Column(dt_headerstack,1)[],"Header"));
dt_headerstack << Delete Rows(rows_to_delete);// Add grouping for update
new_col = dt_headerstack << New Column("Group", Numeric, Ordinal, Formula(Row()));
dt_headerstack << run formulas;
new_col << Delete Formula;
dt_result << Update(
With(dt_headerstack),
Match Columns(:Group =:Group));Close(dt_headerstack, no save);Close(dt_headers, no save);// close earlierClose(dt_params, no save);// close earlierClose(dt, no save);// close earlier/*
sheetList = Get Excel Worksheets("$DOWNLOADS/Book1.xlsx"); // for sheet list to loop over
*/