별도의 .csv 파일에 있는 행의 값에 따라 jmp 파일의 열 이름을 바꿉니다.안녕하세요,
저는 JSL의 초보자이므로 도움을 주셔서 감사합니다.
세 개의 파일이 있습니다.
file #1: [as ref.csv]는 아래와 같이 3개의 열을 포함하는 참조 파일입니다.
카테고리, 폭, 라벨
--------------------------------
A,0,L1.abc
A,1,L2.xt
A,2,L8.dr
A,3,L20.ws
A,4,L72.oz
B,0,L11.qq
....
B,6,L61.er
파일 #2: 범주, 데이터 및 기타 여러 열을 포함하는 JMP의 데이터 파일 #1.
파일 #3: 범주, 데이터 및 기타 여러 열을 포함하는 JMP의 데이터 파일 #2.
두 데이터 파일[파일 #2와 파일 #3]의 차이점은 데이터 열의 범주 유형과 값의 너비입니다.
데이터 파일 #1:
범주|데이터|많은 열.....
----------------------------------------
123.23 ....
321.45 ....
.....
많은 행
열 "데이터"[점 제외]의 값 너비가 지정된 범주에 대한 파일 #1의 행 수와 일치합니다.
예:
데이터 파일 #1의 행 1에서 123.23의 너비는 5입니다.
범주 A에 대한 참조 파일의 행 수는 5입니다. 이는 테스트할 필요가 없습니다. 이것이 테이블이 들어오는 방식입니다[예: 소스에서 가져올 때]
앞으로는 참조 파일에서 범주 A의 경우 행 수가 6 이상으로 증가하고 데이터베이스에서 정보를 가져올 때 파일 데이터 파일 #1의 데이터 열에 있는 값의 너비도 증가합니다.
데이터 파일 #2:
범주|데이터|많은 열.....
----------------------------------------
B 1236.23 ....
B 3213.45 ....
.....
많은 행
목표 1: 데이터 파일 #1 [및 기타 데이터 파일]의 "데이터" 열에 있는 값의 너비에 따라 새 열 생성
나는 목표 # 1을 끝냈습니다!
전:
업데이트된 데이터 파일#1은 다음과 같습니다.
범주|데이터|c1|c2|c3|c4|c5|많은 열.....
----------------------------------------
A 123.23 1 2 3 2 3 ....
A 321.45 3 2 1 4 5 ....
.....
목표 2: 참조 파일의 "레이블" 열에 정의된 대로 데이터 파일 #1[예: c1 ~ c5]의 새 열 이름을 L1... ~ L72...로 변경합니다. 셀 값을 변경하지 않고 선택한 열 이름만 업데이트합니다.
목표 2가 완료된 후 예상 출력:
데이터 파일 #1을 다음과 같이 업데이트합니다.
범주|데이터|L1.abc|L2.xt|L8.dr|L20.ws|L72.oz|많은 열.....
----------------------------------------
A 123.23 1 2 3 2 3 ....
A 321.45 3 2 1 4 5 ....
.....
목표 #2에 대한 도움이 필요합니다.
목표 #2를 위해 참조 파일을 열었지만 앞으로 나아갈지 확신할 수 없습니다.
감사해요
다윗
데이터 접근대량 맞춤화Re: 별도의 .csv 파일에 있는 행의 값에 따라 jmp 파일의 열 이름을 바꿉니다.좋습니다.....이것은 약간 까다롭습니다.....하지만 dataTablesList에 있는 것은 데이터 테이블 이름 목록이 아니라 데이터 테이블을 가리키는 데이터 테이블() 함수입니다.
{"Table1","Table2"} // 데이터 테이블 이름 목록
{ data table( "Table1" ), data table( "Table2" ) } // 데이터 테이블에 대한 포인터 목록Re: 별도의 .csv 파일에 있는 행의 값에 따라 jmp 파일의 열 이름을 바꿉니다.예. 알았어요. 데이터 테이블의 이름을 보유
-데이빗
Re: 별도의 .csv 파일에 있는 행의 값에 따라 jmp 파일의 열 이름을 바꿉니다.dataTableList는 데이터 테이블을 보유하지 않고 테이블에 대한 포인터만 보유합니다. 목록을 만든 다음 실행
Show( dataTableList );
목록에 무엇이 있는지 볼 수 있습니다.
또한 변수 위로 마우스를 가져가면 목록에 있는 항목을 볼 수 있으며 해당 값이 표시됩니다.
Re: 별도의 .csv 파일에 있는 행의 값에 따라 jmp 파일의 열 이름을 바꿉니다.고마워 짐. [내 필요에 맞게] 약간 변경하면 작동합니다! 감사합니다 !!
질문, [datatableList] 목록에 많은 정보를 담을 수 있나요?
각 테이블에는 수천 개와 같은 많은 행이 있고 많은 열도 있습니다.
-데이빗
Re: 별도의 .csv 파일에 있는 행의 값에 따라 jmp 파일의 열 이름을 바꿉니다.잘못된 정보에 대해 죄송합니다.범주 데이터 테이블의 구조를 잘못 읽었습니다.다음은 두 개의 데이터 테이블과 범주 테이블을 만든 다음 데이터 테이블을 확장하고 마지막으로 범주 데이터 테이블의 항목을 기반으로 열 이름을 바꾸는 스크립트입니다.이것이 우리를 정상 궤도로 되돌리기를 바랍니다.스크립트는 필요한 만큼 많은 데이터 테이블에서 작동합니다.처리할 모든 데이터 테이블을 dataTableList 목록에 추가하기만 하면 됩니다.
Names Default To Here( 1 );
// This example script opens up 2 data tables and 1 category table.
// In reality, as many as necessary data tables could be used
// Create the tables
dt1 = New Table( "Table1",
Add Rows( 3 ),
New Column( "Category", Character, "Nominal", Set Values( {"ABC", "ABC", "ABC"} ) ),
New Column( "DATA", Character( 33 ), "Nominal", Set Values( {"123.56.8.342", "431.02.0.567", "318.00.1.816"} ), Set Display Width( 182 ) )
);
dt2 = New Table( "Table2",
Add Rows( 3 ),
New Column( "Category", Character, "Nominal", Set Values( {"B", "B", "B"} ) ),
New Column( "Data", Character, "Nominal", Set Values( {"13.24", "98.44", "63.89"} ) )
);
dtCat = New Table( "The Categories",
Add Rows( 13 ),
New Column( "Category",
Character,
"Nominal",
Set Values( {"ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "B", "B", "B", "B"} ),
Set Display Width( 67 )
),
New Column( "Width", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3] ) ),
New Column( "Label",
Character( 16 ),
"Nominal",
Set Values(
{"label0.0", "label0.1", "label0.2", "label0.3", "label0.4", "label0.5", "label0.6", "label0.7", "label0.8", "thelabel.1", "thelabel.2",
"thelabel.3", "thelabel.4"}
),
Set Display Width( 99 )
)
);
// Below this line, is the script that will add the new columns to each of the data tables
// and will take the names from the dtCat (Categories) data table and change the names to
// the columns in each of the data tables
// Create a list of the pointers to the data tables. This will allow for the using of the list
// entries to point to the data tables using a subscript
dataTableList = {};
insert into(dataTableList, dt1 );
insert into(dataTableList, dt2 );
// Loop across the data table list and expand the columns based upon the the column called Data
For( i = 1, i <= N Items( dataTableList ), i++,
ncols_to_add = length( substitute((dataTableList[i]:Data)[1],".",""));
For( k = 1, k <= ncols_to_add, k++, // the || operator joins two strings
dataTableList[i] << New Column( "c" || Char( i ),
Numeric,
Continous,
<<SET each="" value=""></SET>Re: 별도의 .csv 파일에 있는 행의 값에 따라 jmp 파일의 열 이름을 바꿉니다.짐,
아래 수정 사항이 있는 2단계의 경우 [아래에 표시됨]
++++
이것은 내 ref.csv입니다.
범주|너비|레이블
ABC 0 라벨0.0
ABC 1 라벨0.1
ABC 2 라벨0.2
ABC 3 라벨0.3
ABC 4 라벨0.4
ABC 5 라벨0.5
ABC 6 라벨0.6
ABC 7 라벨0.7
ABC 8 라벨0.8
ABC 9 라벨0.9
ABC 10 라벨0.10
ABC 11 라벨0.11
ABC 12 라벨0.12
ABC 13 라벨0.13
ABC 14 라벨0.14
ABC 15 라벨1.15
ABC 16 라벨0.16
ABC 17 라벨0.17
ABC 18 라벨0.18
ABC 19 라벨0.19
ABC 20 라벨0.20
B 0 라벨11.22
C 1 라벨11.21
D 2 라벨11.23
E 0 라벨11.24
내 코드:
dt_ref = 열기("ref.csv");
For( i=1, i<= N 행( dt_ref ), i++,
insert into(Category_List, word(1,:label[i],".") || "." || word(2,:label[i], "." ) );
);
show(Category_List);
+++
로그에 다음이 표시됩니다.
Category_List = {"label0.0", "label0.1", "label0.2", "label0.3", "label0.4", "label0.5", "label0.6", "label0.7" , "label0.8", "label0.9", "label0.10", "label0.11", "label0.12", "label0.13", "label0.14", "label1.15", " label0.16", "label0.17", "label0.18", "label0.19", "label0.20", "label11.22", "label11.21", "label11.23", "label11. 24", ".", "."};
범주가 ABC인 경우에만 레이블을 선택하고 싶습니다. 어떻게 해야 합니까?
다음을 시도했지만 Category_List에 대해 아무것도 반환되지 않습니다.
prod_found ={"ABC"};
if (:제품 == prod_found,
For( i=1, i<= N 행( dt_ref ), i++,
insert into(Category_List, word(1,:name[i],".") || "." || word(2,:name[i], "." ) );
);
);
감사해요,
다윗
Re: 별도의 .csv 파일에 있는 행의 값에 따라 jmp 파일의 열 이름을 바꿉니다.알려주신 코드를 보니.. 약간의 혼란이 있는 것 같습니다.
이것이 내가 가로 채고 나를 바로 잡는 방법입니다. 잘못되었습니다.
dtcat은 열 이름이 [ 범주, 너비, 레이블].
col 이름이 [Category|data|many cols.....]인 동일한 구조를 가진 여러 데이터 테이블 dt1, dt2 등이 있습니다.
코드를 실행하면 아무 작업도 수행되지 않습니다.
dtcat 테이블에 데이터라는 열이 없으며 디버그를 조사했습니다.
데이터 열이므로 dt1 테이블을 의미할 수 있습니다.
나는 놀아 보았고 도움이되지 않을 것입니다.
나는 우리가 표의 정의에 맞춰져 있다고 생각하고, 원래 게시물에서 설명한 것을 사용합니다. 제 생각에는 도움이 될 것입니다.
여기에서 도움을 주셔서 다시 한 번 감사드립니다.
2 단계에 대한 권장 사항을 알려 드리겠습니다.
감사해요
다윗
Re: 별도의 .csv 파일에 있는 행의 값에 따라 jmp 파일의 열 이름을 바꿉니다.- 당신은 내 마지막 코드가 작동하지 않는다고 표시합니다.....왜 안되죠?
- 요청하는 목록을 만드는 방법은 다음과 같습니다.
Category_List = {};
For( i=1, i<= N Rows( dtCat ), i++,
insert into(Category_List, word(3,:data[i],".") || "." || word(4,:data[i], "." ) );
);
Re: 별도의 .csv 파일에 있는 행의 값에 따라 jmp 파일의 열 이름을 바꿉니다.고마워 짐.그것은 작동하지 않습니다.
따라서 목표 #2를 위해 전체 논리를 가치 단계로 분류했습니다.
1단계: 데이터 테이블에서 범주 이름을 가져오고[dt1이라고] 변수에 저장합니다[범주 A를 보유하고 있다고 가정]- 완료
2단계: 1단계에서 변수를 읽고 범주 = A와 일치하는 모든 행을 찾습니다.] ref.csv의 "Label" 열에서 레이블 이름을 가져와 [dtCat이라고 했습니다], 목록 또는 변수에 저장합니다. [category_list라고 합니다]
따라서 토론에 언급된 예에서 사용합니다. 나는 category_list가 값 이하를 유지할 것으로 기대하고 있습니다.
카테고리_목록 = L1.abc, L2.xt, L8.dr, L20.ws, L72.oz
어떻게 해야할지 모르겠습니다. 도움을 주셔서 감사합니다.
3단계: 목록에서 개수 확인 == no. dt1에서 생성된 새 열의 수입니다. 이것은 내가 견고함을 위해 하고 있는 추가적인 일입니다.
category_list의 개수는 5개 요소입니다.
dt1에서 생성된 새 열은 5입니다. [얼마나 많은 새로운 열이 필요한지 알아보기 위해 변수를 들고 있기 때문에 목표 1에서 이것을 얻었습니다].
4단계: i = 5인 루프를 사용하여 dt1의 열 이름, 즉 c[i]를 목록 [i]로 바꿉니다.
c1 교체
저는 지금 2단계에 있으며 도움이 필요합니다.
감사해요,
다윗
Re: 별도의 .csv 파일에 있는 행의 값에 따라 jmp 파일의 열 이름을 바꿉니다.다음은 테스트되지 않은 스크립트입니다. 두 번째 목표를 거의 달성할 수 있을 것입니다.
dtCat = Data Table( "file#1 name" );
dt1 = Data Table( "file#2 name" );
dt2 = Data Table( " file#3 name" );
// add dt3, dt4 etc. for each of the categories you have
// Find the number of data tables to process....A B C......
// Create a temporary new column in data table dtCat that has just the category
dtCat << New Column( "temp", character, formula( Word( 1, :data, "." ) ) );
// Summarize the data getting one element in the ByGroup list for each Category found
Summarize( dt, Categories = ByGroup( :temp ) );
numCategories = N Items( Categories );
For( i = 1, i <= numCategories, i++,
// Subset the dtCat table into the a new data table with just the one
// category being processed
dtCat << select where( :temp == Categories[i] );
dtSub = dtCat << subset( selected rows == 1, selected columns( 0 ) );
// set the offset of where to start the renaming
offset = 3;
// Loop
// Change names in dt1 to match the Label in
For( k = 1, k <= N Rows( dtSub ), k++,
Eval(
Substitute(
Expr(
Column( __dt__, k + offset ) << set name( Word( 3, dtSub:Data[k], "." ) ),
Expr( __dt__ ),
Parse( "dt" || Char( i ) )
)
)
)
);
Close( dtSub, nosave );
);