スクリプトでのテーブル全体の検索と置換<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />ヨーロッパの同僚が作成した大規模なデータ テーブル (+100,000 レコード) がいくつかあります。
表が作成されたとき、EU 番号付け形式が使用されました。つまり、「,」は小数点です。
「,」を「.」に置き換えるテーブル全体の置換を行う必要があります。テーブルが既存のスクリプトで動作するようにするためです。
get column names() ステートメントを使用して列名を取得できますが、substitute(...) ステートメントまたはsubstitute into(...) ステートメントを使用して一括置換を行う方法がわかりません。
デビッド
Re: スクリプトでのテーブル全体の検索と置換こんにちは、デイビッドさん
同じですが逆の問題がありました - ポイントをカンマにグローバルに置き換える区切り文字一連のプロセス ログ ファイルに記録されます。
この問題を解決する最も簡単な方法は、各 jmp ファイルをテキスト ファイルとして保存し、JMP の「最善の推測」オプションを使用してインポートすることであることがわかりました。
元の区切り文字がシステムが予期する区切り文字に置き換えられ(私の場合、「.」が「,」に置き換えられました)、列がカテゴリ列から連続列に再分類されました。 1 つを手動で実行し、残りを処理するスクリプトのソースを使用しました。
Re: スクリプトでのテーブル全体の検索と置換興味深い議論。いくつかのコードをいじってみたところ、 49 65394 列のグローバル列名変更の場合は秒。Lenovo T420 PC、Windows 7 64 ビット、JMP 64 ビット、4 GB RAM。
dt =開ける( 「$sample_data\Probe.jmp」 ) ;
// 列数を 65000 に拡張します
// 警告には最大 10 分かかります。
のために(私= 1 、私<= 65000 、私++、
dt <<新しい列( 「XYZ」 ||チャー(私) 、数値、継続的) ;
) ;
スタートdt =今日() ;
列名リスト= dt <<列名を取得する(弦) ;
ノースカロライナ州= ncols ( dt ) ;
のために(私= 1 、私<=ノースカロライナ州、私++、
one_col_name =列名リスト[私】 ;
// 問題の文字列が含まれている場合にのみ列の名前を変更します
もし(含まれています( one_col_name 、 "バツ" ) 、
カラム(私) <<セット名(代わりの( one_col_name 、 "バツ" 、 「D」 )) ;
) ;
) ;
終了_dt =今日() ;
印刷する(チャー(終了_dt -スタートdt ) || 「秒間」 ||チャー(ノースカロライナ州) || 「コラム」 ) ;
Re: スクリプトでのテーブル全体の検索と置換以下の方法を使用して検索ダイアログを呼び出そうとしましたが、確実に動作しません。 スクリプトで設定を編集するとダイアログが切断されるようです。 しかし、もしかしたら誰かがコードを改善する方法を見つけてくれるかもしれません。
この異常に幅の広いファイルが JMP の外部からのものである場合は、インポート前に列名を編集する方が効率的である可能性があります。たとえば、JSL からトリガーできる Perl または VBA スクリプトを使用します (プラットフォームに応じて異なる場合があります)。
dt =現在のデータテーブル() ;
古い= 「C」 ;
新しい= 「Q」 ;
dt <<ウィンドウを前面に移動;
// 検索ダイアログを呼び出して設定を編集します
メインメニュー( "探す" ) ;
w =窓( 「検索ダイアログ」 ) ;
w [テキストエディットボックス( 1 )] <<テキストを設定する(古い) ;
w [テキストエディットボックス( 2 )] <<テキストを設定する(新しい) ;
もし( w [チェックボックスボックス( 2 )] <<得る、 w [チェックボックスボックス( 2 )] <<セット( 1 )) ;
もし( w [チェックボックスボックス( 6 )] <<得る、 w [チェックボックスボックス( 6 )] <<セット( 1 )) ;
もし(( w [チェックボックスボックス( 7 )] <<得る) == 0 、 w [チェックボックスボックス( 7 )] <<セット( 1 )) ;
w [ボタンボックス( 3 )] <<クリック;
//メインメニュー( "すべて置換" );
Re: スクリプトでのテーブル全体の検索と置換もしかしたら、「列名を取得する」というコメントに基づいて David が尋ねていたことを混乱させてしまったのかもしれません。私は彼が(実際の行データではなく)列名を変更したいのではないかと思いました。いずれにせよ、それが私がやろうとしていることです。複数の列の名前を変更したい(つまり、すべての列名から「labdata」を削除する)。それが上記のスクリプトが行うことです。JSL では、85,000 列で約 19 秒かかります。「検索ダイアログ」にかかる時間はほんの数秒です。
どのようにするかに関するアイデアはありますかそれFor ループ (または非常に効率的なループ) がありませんか?
ありがとう、
ジェイク
Re: スクリプトでのテーブル全体の検索と置換MacBook Pro 上の JMP 11 では、「5800 行で 2 秒」、つまり Today( ) の代わりに HP time( ) を使用すると 1.753558 秒になります。
上記の主張とは対照的に、ここでは組み込みの検索と置換がはるかに遅くなります。 以下のコードは完了までに 16.27 秒かかります (コードは、検索ダイアログが以前の手動検索によって「準備されている」ことを前提としています)。
dt =開ける( 「$Sample_Data\Probe.jmp」 ) ;
スタートdt = HP時間() ;
メインメニュー( 「全部交換」 ) ;
終了_dt = HP時間() ;
印刷する(チャー((終了_dt -スタートdt ) / 1e6 ) || 「秒間」 ||チャー(番号) || 「行」 ) ;
Re: スクリプトでのテーブル全体の検索と置換以下は、サンプル データセットからの大きなテーブルの例です。行数は 5800 行のみで、所要時間は 8 秒です。Lenovo T420 上の JMP 11 64 ビット。さまざまなアプローチを比較してみると興味深いでしょう。
dt =開ける( 「$Sample_Data\Probe.jmp」 ) ;
列名= dt <<列名を取得する(数値、弦) ;
のために(私= 1 、私<=ナイアイテム(列名) 、私++、
カラム( dt 、列名[私]) <<データ・タイプ(キャラクター) ;
) ;
スタートdt =今日() ;
番号=狭い( dt ) ;
列名= dt <<列名を取得する(弦) ;
のために(私= 1 、私<=ナイアイテム(列名) 、私++、
1 列=カラム( dt 、列名[私]) ;
のために( k = 1 、 k <=番号、 k ++、
1 列[ k 】 =代わりの( 1 列[ k 】 、 「。」 、 「、」 ) ; // 小数点をカンマに置き換えます
) ;
) ;
終了_dt =今日() ;
印刷する(チャー(終了_dt -スタートdt ) || 「秒間」 ||チャー(番号) || 「行」 ) ;
Re: スクリプトでのテーブル全体の検索と置換こんにちは、デイビッドさん
**ここまで入力した後、元の質問がかなり前に投稿されたことに気付きました。しかし、誰かがそれを手伝ってくれるかどうかという「より効率的な」という私の疑問はまだ残っています。 **
私はこれと同じことを理解しようとしています。解決策の 1 つは、For ループを使用して各列を個別に処理することですが、これにはデータセットによってはかなりの時間がかかる場合があります。参考までにコード例を以下に示します。
dt = 現在のデータテーブル();
のために( i=1,i<=ncol(dt),i++,
列名= 列(i) << 名前を取得;
新しい列名= munger(colname,1,"replacestring",""); // "Substitute" コマンドでも同様のことができます
列(i) << 名前を設定(newcolname);
);
これを処理するための For ループよりも効率的な方法を知っている人はいますか?たとえば、標準の [検索と置換] ダイアログ ボックスを使用する場合、これは非常に迅速に実行されます。ただし、約 65,000 列の場合、For ループ手法にはかなりの時間がかかります。
ありがとう、
ジェイク