配列を文字列に変換しますこんにちは、みんな、
別のテーブルの配列から値を取得し、それを選択の値として使用しようとしています。 配列を文字列に変換する方法はありますか?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(:Name_final==name_key);
データ表その他スクリプティングRe:配列を文字列に変換します私はこれがあなたが望むものをあなたに与えると思います
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
Re:配列を文字列に変換します繰り返しになりますが、質問の核心にたどり着くジムの能力に驚いています。 ここにある2つのすばらしいコードは、もっと長い説明に値します。
これは何をしますか?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
ref_file_1データテーブルリファレンスです。 "名前"文字列としての列の名前(文字通り「NAME」ですが、変数に含めることもできます)であり、カラム関数は列参照を返します。 ザ・<<値を取得メッセージは、重複を含め、列からすべての値を取得します。 ザ・連想配列関数は一意の値のセットを作成し、 <<キーを取得メッセージは一意の値を返します。 (うまくやった@ jshvt17 。)
この?
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
ザ・<<場所を選択メッセージは、の各行で機能しますmerged_file 、一度に1つずつ、引数がゼロ以外の場合に行を選択します。
ザ・loc()関数はインデックスの行列を返します。 でリストを検索しますname_key :Name_finalのオカレンスの場合。 結果の行列には0個以上の行を含めることができますが、この例では、キーが一意であるため、0行または1行になります。 ザ・nrows()関数は0または1を返し、それは> 0と比較され、0または1のままになります。 したがって、:Name_finalがref_file_1:NAMEのリストにある場合、行が選択されます。
代替案:
name_keyに> 1e6の名前があり、merge_fileに> 1e7の行がある場合はどうなりますか? パフォーマンスはどのようになりますか? loc関数はたくさん検索します。 1e13文字列を比較します。 あなたは待つのにうんざりするでしょう。 そのための修正は、次のような連想配列を使用することです。
nameSet = associative array(column(ref_file_1, "NAME") << get values);
merged_file << select where(contains(nameSet, :Name_final));
現在、nameSetには1e7ルックアップしかありません。 それらは無料ではありませんが、1e6アイテムを順番にチェックするよりもはるかに高速です。 それぞれ約20の比較があると思います(log2(1e6))。 これは、次のメンテナがフォローするのも簡単かもしれません。
(テストされていません。 訂正は大歓迎です!)
Re:配列を文字列に変換しますクレイジ、
もう一度、JMPについて何か新しいことを学びました。私はもともとContains()関数を使用してコードを記述していましたが、次にLoc()関数を使用するように変換しました。
Contains( "BARBARA ANN", "BARBARA")
Trueを返します。
含むの比較コンポーネントがアイテムのJMPリストである場合、私は(間違って判明しました)、
Contains( {"BARBARA ANN", "BETTY", "DAVID"}, "BARBARA")
Trueも返しますが、Falseを返します。これは、完全一致を行うことを意味します。
素晴らしい情報をありがとう