별도의 .csv 파일에있는 행의 값에 따라 jmp 파일의 열 이름 이름을 바꿉니다.여보세요,
저는 JSL의 초보자이므로 도움을 주셔서 감사합니다.
세 개의 파일이 있습니다.
file # 1 : 아래와 같이 3 개의 col을 담고있는 [ref.csv로] Reference 파일입니다.
카테고리, 너비, 라벨
--------------------------------
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 :
카테고리 | 데이터 | 많은 열 .....
----------------------------------------
A 123.23 ....
A 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 : 참조 파일의 "label"열에 정의 된대로 데이터 파일 # 1 [ie 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 파일의 열 이름 이름을 바꿉니다.다음은 두 번째 목표를 달성 할 수있을 정도로 거의 테스트되지 않은 스크립트입니다.
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 );
);Re : 별도의 .csv 파일에있는 행의 값에 따라 jmp 파일의 열 이름 이름을 바꿉니다.고마워 짐.그것은 작동하지 않습니다.
그래서 목표 # 2에서는 전체 논리를 가치 단계로 세분화했습니다.
1 단계 : 데이터 테이블 [예 : dt1]에서 카테고리 이름을 가져 와서 변수에 저장합니다 [예 : A의 카테고리를 보유하고 있음]-완료
2 단계 : 1 단계에서 변수를 읽고 category = A와 일치하는 모든 행을 찾습니다. ref.csv의 "Label"열에서 레이블 이름을 가져 와서 [dtCat으로 호출 한] 목록 또는 변수에 저장합니다. [category_list라고 말 해주세요]
그래서 토론에 명시된 예에서 사용합니다. category_list가 아래 값을 보유 할 것으로 예상합니다.
category_list = L1.abc, L2.xt, L8.dr, L20.ws, L72.oz
나는 이것을하는 방법을 모른다. 도움을 주셔서 감사합니다.
3 단계 : 목록에서 개수 확인 == 아니요. dt1에서 생성 된 새로운 열의. 이것은 견고 함을 위해 제가하고있는 추가 작업입니다.
category_list의 개수는 5 개 요소입니다.
dt1에서 생성 된 새 열은 5입니다. [얼마나 많은 새 열이 필요한지 찾기 위해 변수를 보유하고 있으므로 목표 1에서 이것을 얻었습니다.]
4 단계 : dt1의 cols 이름을 교체합니다. 즉, i = 5 인 루프를 사용하여 c [i]를 목록 [i]로 바꿉니다.
c1 교체
지금 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 파일의 열 이름 이름을 바꿉니다.제공하신 코드를 확인했습니다 .. 약간의 혼란이있는 것 같습니다.
이것이 내가 가로 채고 정정하는 방법은 잘못된 것입니다.
dtcat은 col name [ 카테고리, 너비, 라벨].
col 이름 [Category | data | many cols .....]을 가진 동일한 구조의 여러 데이터 테이블 dt1, dt2 등이 있습니다.
코드를 실행할 때 아무것도하지 않습니다.
dtcat 테이블에 data라는 열이 없으며 디버그를 조사했습니다.
데이터 열이므로 dt1 테이블을 의미 할 수 있습니다.
나는 놀아 보았지만 도움이되지 않았습니다.
나는 우리가 표의 정의에 정렬하고 있다고 생각하고, 원래 게시물에서 설명한 것을 사용하면 내 의견에 도움이 될 수 있습니다.
다시 한번 도움을 주셔서 감사합니다.
2 단계에 대한 권장 사항을 알려 드리겠습니다.
감사
데이비드
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 label0.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 = { "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 (: product == 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 파일의 열 이름 이름을 바꿉니다.잘못된 정보로 죄송합니다.Categories 데이터 테이블의 구조를 잘못 읽었습니다.다음은 두 개의 데이터 테이블과 범주 테이블을 만든 다음 데이터 테이블을 확장하고 마지막으로 범주 데이터 테이블의 항목을 기반으로 열의 이름을 바꾸는 스크립트입니다.나는 이것이 우리를 다시 궤도에 올릴 수 있기를 바랍니다.스크립트는 필요한만큼 많은 데이터 테이블에서 작동합니다.처리 할 모든 데이터 테이블을 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>