比較具有特殊字符的行和列這可能非常簡單,但我是 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() 函數來識別該列。 如果您可以提供示例數據集和您的腳本,我們可以查看它以查看問題所在