それぞれ25個のテーブルを開き、すべてのサマリーテーブルを連結します。こんにちは、
私は新しいJMPユーザーで、JSLを使って自動データ操作をしようとしています。タイトルが述べたように、私はする必要があります
(i = 1、i <= Nitems( "directory")、i ++、
1)25個のテーブルの1つを開きます。
2)開かれたテーブルのサマリテーブルを生成する。
;
3)25個すべてのテーブルをループ処理した後、25個のサマリーテーブルの連結テーブルを生成します。
私は第1部と第2部をやってそれらをループしました。しかし、結果として得られた25個の要約表を自動的に連結する方法がわからない。今度は、すべてのテーブルが生成された後にそれらを手動で連結します。
知識がないのは、各要約表に名前を付けてそれらを連結する必要があるときにそれらを参照する方法です。
また、スクリプトが開いているすべてのテーブル(パート1から)とサマリーテーブル(パート2から)を閉じることができ、連結されたテーブルのみを返すことができればよいでしょう。(私のスクリプトでは、合計50個のテーブルが飛び出します。手動で閉じる必要があります。)
私のスクリプトを添付しました:
デフォルトディレクトリを設定します( "E:\ Test")。
files =ディレクトリ内のファイル( "E:\ Test")。
(i = 1、i <= Nアイテム(ファイル)、i ++、
開いた(
ファイル[i]、
ワークシート( "worksheet1")
すべてのシートに使用(1)
ワークシートを連結する(0)、
連結列(0)を作成します。
ワークシート設定(
1、
列ヘッダーがあります(1)、
ヘッダー内の行数(1)
ヘッダーは行(1)から始まります。
データは行(2)から始まります。
データは列(1)から始まります。
データは行(0)で終わります。
データは列(0)で終わります。
複製スパン行(1)
複製スパンヘッダー(0)
隠れた行を表示しない(1)
隠し列を非表示にする(1)
空の列を非表示にする(1)
階層として扱う(0)
複数シリーズスタック(0)
セルの色をインポート(0)
列検出の制限(0)
列区切り文字列( " - ")
)
;
新しい列( "Xindex"、式(天井(:名前( "X")/:名前( "dimensionX")))));
新しい列( "Yindex"、式(Floor(:名前( "Y")/ :名前( "dimensionY") )))
概要(
グループ(
:名前( "X")、
:名前( "Y")、
Xindex、
:Yindex)、
標準偏差(:名前( "Data1"))、
Freq( "なし")、
重さ( "なし")
)
;
再:25のテーブルを開き、それぞれのサマリーを開き、すべてのサマリーテーブルを連結します。コードでは、つぎのように指定します。
dtConcat = dtSum;
あなたの思考プロセスは、このステートメントを使用するときにデータテーブルのコピーを作成しているということです。 しかし実際には、dtConcatとdtSumは単なる変数であり、データテーブルへのポインタを含みます。dtConcatをdtSumと等しくなるように指定することによって、両方の変数は同じデータテーブルを指しています。
そして、あなたは指定します
close (dtSum,nosave);
これにより、変数dtSumが指しているデータテーブルが閉じます。 これは、dtSumとdtConcatの両方が、現在それらが指している開いているデータテーブルを持っていないことを意味します。
再:25のテーブルを開き、それぞれのサマリーを開き、すべてのサマリーテーブルを連結します。こんにちは。
どうもありがとう!あなたのスクリプトがif()でセミコロンとコンマを使う方法を教えてくれると思います。カンマはtestとexprを分離するのに使われ、セミコロンは複数の引数を一つのexprに結合するのに使われます。これは正しいです?
@txnelson
こんにちはジム、
コンマとセミコロンの使用法が正しい場合は、強調表示されている行を追加して次のスクリプトが機能するはずです。
しかし、この新しいスクリプトでは、i = 2のときにdtとdtSumしか得られません(現在のテーブルにある "i"を追跡するために、すべてのテーブルに別の列を追加しました)。
強調表示された行がなければ、i = 1のときはdtとdtSumが、for()ループが完了したときはdtConcatがあります。
if(i == 1,
dtConcat = dtSum<FONT color="#FF6600"><STRONG>; close(dtSum,nosave);close(dt,nosave);</STRONG></FONT>,
dtConcat = dtConcat << Concatenate(dtSum,"Append to first table");close(dtSum,nosave);Close(dt,nosave);
);
再:25のテーブルを開き、それぞれのサマリーを開き、すべてのサマリーテーブルを連結します。こんにちはジム、
どうもありがとう!今、私はJMPで参照を使用するという感覚を得ました。
if()関数についてもう1つ質問があります。私のスクリプトに追加した次のif()関数では、i == 1がテスト1、dtConcat = dtSumがexpr1、残りが "else expr"です。
私の質問は、どうやったらif()のテスト1に複数の式を追加することができますか?最初のスクリプトでは、3つのテーブルを出力しました。
1)i == 1のときdt。
2)i == 1のときdtSum。
3)for()ループが終了したときのdtConcat。これはまさに私が必要としているものです。
スクリプトを実行した後で、1)と2)を報告したくないのですが、3)だけを報告します。
2番目のスクリプトを試しましたが、うまくいきません。また、どちらのスクリプトも「ロックされたデータテーブルまたは派生データテーブルに追加できない」という警告を出します。
if(i == 1,
dtConcat = dtSum,
dtConcat = dtConcat << Concatenate(dtSum,"Append to first table");close(dtSum,nosave);Close(dt,nosave)
);
2番目のスクリプトでは、1)i == 1のときにdtSumをdtConcatに割り当て、dtSumとdtを閉じます。2)iが1に等しくない場合は、dtSumをdtConcatに連結し、dtSumとdtを閉じます。しかし、思った通りには動きません。これは、カンマとセミコロンを間違った方法で使用しているためです。
if(i == 1,
dtConcat = dtSum; close (dtSum,nosave); close (dt, nosave),
dtConcat = dtConcat << Concatenate(dtSum,"Append to first table");close(dtSum,nosave);Close(dt,nosave)
);
再:25のテーブルを開き、それぞれのサマリーを開き、すべてのサマリーテーブルを連結します。コードに連結手順を追加するだけです......このようなもの
Set Default Directory( "E:\Test" );
files = Files In Directory( "E:\Test" );
For( i = 1, i <= N Items( files ), i++,
dt = Open(
files[i],
Worksheets( "worksheet1" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 2 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
);
New Column( "Xindex", Formula( Ceiling( :Name( "X" ) / :Name( "dimensionX" ) ) ) );
New Column( "Yindex", Formula( Floor( :Name( "Y" ) / :Name( "dimensionY" ) ) ) );
dtSum = dt << Summary(
Group( :Name( "X" ), :Name( "Y" ), :Xindex, :Yindex ),
Std Dev( :Name( "Data1" ) ),
Freq( "None" ),
Weight( "None" );
If( i == 1,
dtConcat = dtSum,
dtConcat = dtConcat << concatenate( dtSum, append to first table );
Close( dtSum, nosave );
);
);
);
再:25のテーブルを開き、それぞれのサマリーを開き、すべてのサマリーテーブルを連結します。 @Zihao 、
JMPでデータテーブルを開くとき、それへの参照をキャプチャする1つの方法は、次のようなことをすることです。
dt = Open(<YOUR custom="" path="">);</YOUR>
これで、dtは、メッセージを渡したりコマンドを発行したりできるデータテーブルへの参照を保持します。データテーブルにメッセージを渡すもう1つの方法は、データテーブルの名前がわかっている場合です。
Data Table("Big Class") // This is an example データテーブルをどのように連結するかについての質問には、次のテンプレートを使用できます。
for(i = 1, i <= N Items(files), i++,
dt = Open(<CUSTOM script="" here="">);
If(i == 1,
dt_Results = New Table("Results");
dt_Results = dt;
,
dt_Results << Concatenate(dt,"Append To First Table");
);
);</CUSTOM>