cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
The Discovery Summit 2025 Call for Content is open! Submit an abstract today to present at our premier analytics conference.
See how to use to use Text Explorer to glean valuable information from text data at April 25 webinar.
Choose Language Hide Translation Bar
View Original Published Thread

名前は奇妙な列名を引用します

pauldeen
Level VI

列名を適合モデル式に挿入しようとしています。 そのためには、:"name"n 規則を使用して、列名内の奇妙な文字をエスケープする必要があります。 では、文字列の列名からこの形式にするにはどうすればよいでしょうか?

colListY = {"Plating Thickness (m\!"\!")"};
//This doesn't work
newcolumnref = eval insert("\[:"^colListY[1]^"n]\");

//Looking for this end result
:"Plating Thickness (m\!"\!")"n

これはどこにでも挿入できます。たとえば、次のようになります。

insert into(expr(Y()), newcolumnref);

これを行う確実な方法を知っている人はいますか?

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。

1 ACCEPTED SOLUTION

Accepted Solutions
Craige_Hales
Super User

Re: 名前が奇妙な列名を引用している

その他のメモ:

列関数でテーブルを明示的に参照しました。 複数のテーブルが開いている場合は、違いが生じる可能性があります。

 

文字列を連結している場合は、これで済む可能性があります。必要でない場合でも、いつでも :"height"n を使用できます (たとえば、高さ)。

colreftxt = ":" || Regex( Log Capture( Print( colListY[1] ) ), "^\s*(.*)\s*$", "\1" ) || "n";
write(colreftxt);

:"メッキ厚さ (m\!"\!")"n

これは正しくエスケープされる可能性があります。 おそらく、このように組み立てられたテキストを解析するよりも式の操作が簡単になるでしょう。

 

 

22 REPLIES 22
txnelson
Super User

Re: 名前が奇妙な列名を引用している

Column 関数または As Column 関数を使用して、複雑な列名を保護できます。

colListY = {"Plating Thickness (m\!"\!")"};

newcolumnref = eval insert("column(\!"^colListY[1]^\!")");

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。

Craige_Hales
Super User

Re: 名前が奇妙な列名を引用している

列の名前を文字列として取得することを避け、代わりに列オブジェクトを取得できれば、より簡単になる可能性があります。 以下の Cols は列オブジェクトのリストであり、名前ではありません。

colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
cols = dt << getcolumnnames;// don't use the string keyword
/* {name, "Plating Thickness (m\!"\!")"n, sex, height, weight} */

script = Expr(
 Fit Model(
  Y( :weight ),
  Effects( F1 ),
  Personality( "Standard Least Squares" ),
  Run(
   :weight << {Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ),
   Plot Effect Leverage( 1 )}
  )
 )
);

Substitute Into( script, Expr( F1 ), cols[2] );
Write( Name Expr( script ) );
/*
Fit Model(
 Y( :weight ),
 Effects( "Plating Thickness (m\!"\!")"n ),
 Personality( "Standard Least Squares" ),
 Run(
  :weight << {Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ),
  Plot Effect Leverage( 1 )}
 )
);
*/

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。

pauldeen
Level VI

Re: 名前が奇妙な列名を引用している

@txnelson問題は、モデルの適合スクリプトを構築するときに、column() 形式を使用できないことです。

 

Fit Model(
 //Y( :"Plating Thickness (m\!"\!")"n ), <- works
 Y(column("Plating Thickness (m\!"\!"")), //<- does not work
 Effects(
  :"Shift-temp"n, :Position, :Subgroup, :"Shift-temp"n * :Position,
  :"Shift-temp"n * :Subgroup, :Position * :Subgroup
 ),
 Personality( "Standard Least Squares" )
);

@Craige_Halesユーザーは Col list box() で列を選択し、それに << get items メッセージを渡します。 これにより、列名のリストが文字列として得られます。 テーブル内でこれらの列名を見つけて列番号を見つけることはできましたが、エフェクト式を組み立てるときに、この方法では上記のようなインタラクションを構築することはできません。

 

名前エスケープを使用して文字列から列参照に移動する式の連結を行う方法はありますか?

 

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。

Craige_Hales
Super User

Re: 名前が奇妙な列名を引用している

2 つの答えを組み合わせて試してみてください。

colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );

script = Expr(
 Fit Model(
  Y( F1 ),
  Effects( :height ),
  Personality( "Standard Least Squares" ),
  Run( F1 << {Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ), Plot Effect Leverage( 1 )} )
 )
);

Substitute Into( script, Expr( F1 ), Column( dt, colListY[1] ) );
Write( Name Expr( script ) );
/*
Fit Model(
 Y( Column( "Plating Thickness (m\!"\!")" ) ),
 Effects( :height ),
 Personality( "Standard Least Squares" ),
 Run(
  Column( "Plating Thickness (m\!"\!")" ) << {Plot Actual by Predicted( 1 ),
  Plot Residual by Predicted( 1 ), Plot Effect Leverage( 1 )}
 )
)
*/

Eval( script );

undefinedrun with column substituted

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。

Craige_Hales
Super User

Re: 名前が奇妙な列名を引用している

その他のメモ:

列関数でテーブルを明示的に参照しました。 複数のテーブルが開いている場合は、違いが生じる可能性があります。

 

文字列を連結している場合は、これで済む可能性があります。必要でない場合でも、いつでも :"height"n を使用できます (たとえば、高さ)。

colreftxt = ":" || Regex( Log Capture( Print( colListY[1] ) ), "^\s*(.*)\s*$", "\1" ) || "n";
write(colreftxt);

:"メッキ厚さ (m\!"\!")"n

これは正しくエスケープされる可能性があります。 おそらく、このように組み立てられたテキストを解析するよりも式の操作が簡単になるでしょう。

 

 

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。

pauldeen
Level VI

Re: 名前が奇妙な列名を引用している

ありがとうクレイジ、これは必要以上に複雑なようですが、うまくいきます:)

 

これをやろうとしている人のために、Craige の解決策を関数に入れておきます。

WrapColumns = Function({ColName},{default local},
 ReturnList = {};
 If(is list(ColName), 
  For(i=1, i<=n items(ColName), i++,
   insert into(ReturnList, parse(":" || Regex( Log Capture( Print( ColName[1] ) ), "^\s*(.*)\s*$", "\1" ) || "n");)
  );
 ,
  insert into(ReturnList, parse(":" || Regex( Log Capture( Print( ColName ) ), "^\s*(.*)\s*$", "\1" ) || "n");)
 );
 Return(ReturnList);
);

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。

Craige_Hales
Super User

Re: 名前が奇妙な列名を引用している

それ複雑すぎる。 実行しているのはそれだけなので、regex() をtrim() に置き換えることもできるでしょう。 当初、私は print() が残した外側の引用符を削除するつもりだと考えていました。 (編集: 入力を解析するためにトリミングする必要はまったくありません!)

 

例では [i] が必要な場所に [1] がある可能性があります。

 

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。

pauldeen
Level VI

Re: 名前が奇妙な列名を引用している

Craige のフィードバックを更新しました。1/i に感謝します。

WrapColumns = Function({ColName},{default local},
 ReturnList = {};
 If(is list(ColName), 
  For(i=1, i<=n items(ColName), i++,
   insert into(ReturnList, parse(":" || Log Capture( Print( ColName[i] ) ) || "n"))
  );
 ,
  insert into(ReturnList, parse(":" || Log Capture( Print( ColName ) ) || "n"))
 );
 Return(ReturnList);
);

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。

Craige_Hales
Super User

Re: 名前が奇妙な列名を引用している

見ている人のために説明すると、print 関数は 2 つのことを行います。内部引用符 (およびその他の特殊な場合) をエスケープし、外部引用符を追加します。 これにより有効な文字列が生成され、Paul のコードは前に : を追加し、その後に n を追加して、結果を JSL に解析します。列名定数。 実際の列が存在する場合もあれば、存在しない場合もあります。列名定数スクリプトで使用するときにアタッチできます。 Paul のコードの実行時には、この列が存在する必要はありません。 print() 関数がないと、エスケープを実行するためにどの関数を使用すればよいかわかりません (ルールが複雑すぎて独自に作成できません)。元の名前には引用符が埋め込まれているため、エスケープする前にエスケープする必要があります。に変わった列名定数

データテーブルが開いている場合は、ほぼ同じ方法で column() 関数を使用して、列オブジェクトそれは (私はかなり確信しています) と同じ場所で使用できます。列名定数現れることがあります。 それか列オブジェクト少なくともテーブルが閉じられるまでは、実際の列を参照します。 有効期限が切れたプラットフォームの起動列オブジェクトまたは列名定数テーブルの列と一致しない場合は、予期されるエラー メッセージが生成されます。

@XanGregg

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。