比较具有特殊字符的行和列这可能非常简单,但我是 JMP 的新手,发现很难找到解决此错误的方法。
意外的“%”。 可能缺少“,”或“)”。
作用域数据表访问需要数据表列或变量访问或评估 dt1: Acidic Variant' , dt1:Acidic Variant /*###*/
我只是将一个表中的一行与另一个表中的列进行比较。 它确实适用于没有 % 或 () 等特殊字符的行和列名称,但我将使用具有特殊字符的名称。 任何人都可以向我指出如何处理吗? 非常感谢任何帮助。 谢谢
回复:比较具有特殊字符的行和列我认为我的循环不正确,因为它没有采用最后一个值。 抱歉更新晚了。
回复:比较具有特殊字符的行和列@txnelson我意识到它只是不采用 example2 最后一行的规格限制。 我仍然不知道为什么,但如果我发现了,我会更新。
谢谢。
回复:比较具有特殊字符的行和列@txnelson感谢您如此及时地回复。
回复:比较具有特殊字符的行和列然后我怀疑列名和limits数据表中的名称有区别
回复:比较具有特殊字符的行和列@txnelson ,但是当我针对更改后的表运行脚本时,规格限制不会输入到“酸性变体”列中。回复:比较具有特殊字符的行和列该脚本逐行读取限制表。然后它从当前所在的任何行获取列名,并按列名而不是列号将限制应用于数据表列。
因此,数据表中列的顺序并不重要
回复:比较具有特殊字符的行和列@txnelson , 如果行与列的顺序不同,是否可以向数据表添加规范限制? 例如,
表 Example1 将保持原样,但表 Example2 将是:

我怎样才能做到这一点? 感谢您的任何输入。
回复:比较具有特殊字符的行和列非常感谢您的解释。
回复:比较具有特殊字符的行和列这个问题在编写 JSL 时很常见……您的列名中有特殊字符。因此,例如,您的列名可能是
甲+乙
以及您正在尝试做的是设置列属性....在本例中为规格限制。所以如果命令直接写出来,它会是这样的:
:A+B << Set Property( "Spec Limits", { LSL( 22 ), USL( 55 ), show limits( 1 ) } );
JSL 不喜欢这样,因为它将把它解释为一个名为“A”的列,您从变量名“B”中添加值,然后对其应用设置属性。JSL 只会抛出一个错误。
因此,解决方案是使用 :Name() 函数。
:Name("A+B") << Set Property( "Spec Limits", { LSL( 22 ), USL( 55 ), show limits( 1 ) } );
这将强制 JSL 将 A+B 解释为列名。现在,为了更精确,如果我们在前面添加一个指向数据表的指针,它将确保它不仅指向特定的列,而且指向特定数据表中的特定列
dt1 = data table("..........");
dt1:Name( "A+B" ) << Set Property( "Spec Limits", { LSL( 22 ), USL( 55 ), show limits( 1 ) } );
现在回答你的具体问题:
( "dt1:Name(\!"" || Column( dt2, "ColumnName" )[i] || "\!")" )
确实需要以更完整的形式来看待它
Parse( "dt1:Name(\!"" || Column( dt2, "ColumnName" )[i] || "\!")" ) )
我们需要始终从内到外检查 JSL。因此,可以说
i = 2;
并且数据表 dt2 中第二行的名为 ColumnName 的变量的值为 A+B。
Column( dt2, "ColumnName" )[i] = "A+B"
所以现在 JSL 代码被解析为
Parse( "dt1:Name(\!"" || "A+B" || "\!")" ) )
下一个操作就是将 3 个字符串合并为一个字符串。
“dt1:名称(\!”)
“A+B”
“\!”)“
看起来字符串 1 和字符串 3 中的双引号太多了。但是在 JSL 中,\!是一个转义字符,表示它后面的字符要区别对待。\!n 被视为换行符,在我们的示例中,\!" 被视为嵌入的双引号。
所以一旦连接完成,JSL 看起来像
Parse( "dt1:Name(\!"A+B\!")" ) )
最后一步是 Parse() 函数的结果操作。它将解析字符串,并准备好执行。在我们的例子中,它只是意味着它将删除外部双引号,并将 \!" 解析为一个简单的双引号,将其保留为
dt1:Name("A+B")
这是引用名称中包含特殊字符的列所需语法的确切形式
dt1:Name( "A+B" ) << Set Property( "Spec Limits", { LSL( 22 ), USL( 55 ), show limits( 1 ) } );
我希望这有帮助
回复:比较具有特殊字符的行和列@txnelson这真的很有效。 但是,你能帮我理解这部分的作用吗? 我尝试使用 name 函数,但无法正常工作。 再次感谢您的帮助。
<SPAN class="token punctuation">(</SPAN> <SPAN class="token string">"dt1:Name(\!"</SPAN><SPAN class="token string">" || Column( dt2, "</SPAN><SPAN class="token function">ColumnName</SPAN><SPAN class="token string">" )[i] || "</SPAN>\<SPAN class="token operator">!</SPAN><SPAN class="token string">")"</SPAN> <SPAN class="token punctuation">)</SPAN>
回复:比较具有特殊字符的行和列这是对您的脚本的修改,将允许它工作。您正沿着正确的路径前进,您只需要在 Substitute 函数中使用 :Name() 函数
Names Default to Here(1);
dt1 = Data Table( "Example1" );
dt2 = Data Table( "Example2" );
a = N Rows( dt2 );
colNamesList = dt1 << get column names( string );
For( i = 1, i < a, i++,
Eval(
Substitute(
Expr(
If( Try( __col__ << get name, "" ) != "",
__col__ << Set Property(
"Spec Limits",
{LSL( _LSL_ ), USL( _USL_ ), Target( _Target ), Show Limits( 1 )}
)
)
),
Expr( __col__ ), Parse( "dt1:Name(\!"" || Column( dt2, "ColumnName" )[i] || "\!")" ),
Expr( _LSL_ ), dt2:LSL[i],
Expr( _USL_ ), dt2:USL[i],
Expr( _Target ), dt2:Target[i],
)
)
);
另外,我添加了一个检查以确保在目标数据表中找到该列,因此脚本不会出错,并在所有记录处理完之前停止处理。
回复:比较具有特殊字符的行和列@Aam_jmp ,
也许这是一篇有用的帖子,您可以从中学到一些东西https://community.jmp.com/t5/Discussions/Spec-limits-issue/mp/50166。
我试图通过线程了解您的实际问题是什么? 如果您定义了您的目标,这可能会有所帮助 - 这样线程更容易回答并且对整个社区都有好处。
回复:比较具有特殊字符的行和列乌代,谢谢你的帮助。 我正在自学这部分。 但是,我试图使用另一个数据表来完成对数据表的规范限制。 如果列名没有特殊字符,我可以顺利地做到这一点。 但是,我无法处理数据表中的特殊字符。 我尝试的一种方法是在我的列名中找到 (%) 并将它们替换为空格。 即使成功了,我也不认为这是解决我的问题的最佳方法。 我知道我可以使用插件来添加规范限制,但最好知道如何使用 jsl 解决这个问题。 感谢您就此提供的任何意见。 我的代码是:
dt1 = Data Table( "Example1" );
dt2 = Data Table( "Example2" );
a = N Rows( dt2 );
For( i = 1, i < a, i++,
Eval(
Substitute(
Expr(
__col__ << Set Property( "Spec Limits", {LSL( _LSL_ ), USL( _USL_ ), Target( _Target ), Show Limits( 1 )} );
),
Expr( __col__ ), Parse( "dt1:" || dt2:ColumnName[i] ),
Expr( _LSL_ ), dt2:LSL[i],
Expr( _USL_ ), dt2:USL[i],
Expr( _Target ), dt2:Target[i],
)
)
);
回复:比较具有特殊字符的行和列@Aam_jmp ,
如果您查看 Parse() 的文档,您可以在 Help => Scripting Index ==> Parse 下找到它,
根据其定义解析需要一个字符串,但是您在实现中传递了 2 个参数并期望将它们连接起来。 这就是我明白为什么即使您提供了正确的列名称它也不起作用的原因。 Scripting Index 是您的朋友,越来越多地使用它来帮助您了解语法和函数定义。
回复:比较具有特殊字符的行和列为什么即使我给出了正确的列名称,它也没有使用 Parse 给出我想要的输出? 有没有办法解析特殊字符,如 % 和 ()? @uday_guntupalli
回复:比较具有特殊字符的行和列@Aam_jmp
dt1 = data table( "Example1" );
dt2 = data table( "Example2" );
ColValuesEx2 = dt2:Column 1 << Get Values;
a = n rows(dt2);
Res= {};
For(i=1,i<=a,i++,
temp = Concat("dt1:",ColValuesEx2[i]);
Insert Into(Res,temp);
);
Show(Res);
尝试这个。 我在您之前所做的事情中看到的问题是,ColName 没有引用实际的列。 当您尝试将范围限定到数据表 2 时,您应该引用数据表中存在的列。
我使用 concatenate 而不是 Parse,我得到了你想要的结果。

回复:比较具有特殊字符的行和列@uday_guntupalli尽管我无法提供该表,但我想要实现的一部分是能够解析列名。 我制作了看起来有些相似的数据表。 我希望以下代码适用于此数据。
Names Default To Here( 1 );
dt1 = data table( "Example1" );
dt2 = data table( "Example2" );
dt4 = dt2:Column 1 << get values();
a = n rows(dt2);
For(i=1,i<=a,i++,
Parse("dt1:" || dt4[i]);
);
回复:比较具有特殊字符的行和列@Aam_jmp ,
请重新阅读我的回复并尝试使用以下示例。 名称功能将能够处理您遇到的问题。 我正在发布相同的样本。 除非您共享您的脚本和示例数据,否则很难看出是什么导致了错误。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" ); // Open Sample Data
MeanWeight = Col Sum(dt:weight); // Calculate Column Mean
dt << New Column("% of Total Weight",Numeric,Format("Percent",10,2),Continuous,Formula(:weight/MeanWeight)); // Define New column with % in name
dt << New Column("Test",Numeric,Format("Percent",10,2),Formula(Col Cumulative Sum(:Name("% of Total Weight")))); // Define Test Column that demonstrates the use of Name function that can capture the column name with % in it 希望这能更好地解释我的建议,如果不能提供更多细节,以便我尝试提供帮助
回复:比较具有特殊字符的行和列名称是这样的:Titer (%) 1, Titer(%) 2 等等回复:比较具有特殊字符的行和列@Aam_jmp ,
如果 % 符号是列名的一部分,比如列名是“%x”,则尝试使用 Name() 函数来识别该列。 如果您可以提供示例数据集和您的脚本,我们可以查看它以查看问题所在