根据单独的.csv文件中行中的值重命名jmp文件中的列名你好,
我是JSL的新手,非常感谢您的帮助。
我有三个文件。
文件#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:
类别|数据|许多列.....
----------------------------------------
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:按照参考文件中“标签”列中的定义,将数据文件#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,我打开了参考文件,但不确定前进。
谢谢
大卫
数据表回复:按照单独的.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 );
);回复:按照单独的.csv文件中各行中的值重命名jmp文件中的列名谢谢吉姆。它不起作用。
因此,对于目标2,我将整个逻辑分解为价值步骤。
步骤1:从数据表中获取类别名称[例如dt1],并将其存储在变量中[例如,它持有A的类别]-完成
步骤2:从步骤1中读取变量,并找到与category = A]匹配的所有行,并从ref.csv的“标签”列中获取标签名称,[您将其称为dtCat],并将其存储在列表或变量中。 [称它为category_list]
因此,请使用讨论中所述的示例。 我期望category_list保持低于值。
category_list = L1.abc, L2.xt L8.dr, L20.ws, L72。盎司
我不知道该怎么做。 感谢帮助。
步骤3:检查列表中的计数==否。在dt1中创建的新列。这是我为提高鲁棒性而要做的事情。
在category_list中的计数是5个元素
在dt1中创建的新列为5。 [我从目标1得到这个,因为我拿着一个变量来查找需要多少个新列]。
步骤4:使用i = 5的循环,用列表[i]将dt1中的cols名称替换为c [i]
c1取代
我现在处于第2步,需要一些帮助。
谢谢,
大卫
回复:按照单独的.csv文件中各行中的值重命名jmp文件中的列名- 您指出我的上一个代码不起作用.....为什么不呢?
- 这是一种创建您要的列表的方法
Category_List = {};
For( i=1, i<= N Rows( dtCat ), i++,
insert into(Category_List, word(3,:data[i],".") || "." || word(4,:data[i], "." ) );
);
回复:按照单独的.csv文件中各行中的值重命名jmp文件中的列名我查看了您提供的代码。 似乎有些混乱。
这就是我拦截并纠正我的方式,这是错误的。
dtcat是具有col名称[类别,宽度,标签]。
有多个具有相同结构的数据表dt1,dt2等,其列名为[Category | data | many .....]
当我运行代码时,它什么也没做
在dtcat表中没有名为data的列,并调查了调试。
可能是您的意思是dt1表,因为它是数据列。
我尝试玩耍,这无济于事。
我认为我们在表格上的定义保持一致,请使用我在原始帖子中描述的内容,我认为可能会有所帮助。
再次感谢您的帮助。
让我推荐第二步
谢谢
大卫
回复:按照单独的.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”);
对于(i = 1,i <= N Rows(dt_ref),i ++,
插入(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”};
如果(:product == prod_found,
对于(i = 1,i <= N Rows(dt_ref),i ++,
插入(Category_List,word(1,:name [i],“。”) || “。” || word(2,:name [i],“。”));
);
);
谢谢,
大卫
回复:按照单独的.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>