C# DataTable 変数から JMP データテーブルを作成するC# DataTable 変数から JMP データテーブルを作成する最も効率的な方法は何ですか?現在、Windows のクリップボードを使用してすべての情報を JMP に貼り付けています。 (C# で最初にクリップボードを埋めます) これは機能しますが、Windows のクリップボードは信頼性が低く、空になることがあります。
数か月前にサポート チケットを送信したところ、このメッセージが届きました。
サポートメッセージ:
...................................
また、文書化されているように、GetTableHandleFromIndex メソッドまたは GetTableHandleFromName メソッドを使用して、DataTable オートメーション オブジェクトへの C# 参照を取得することもできます。ここ。
...................................
リンクを読んだとき、これが何を意味するのかよくわからず、何をすればよいのかわかりませんでした。
基本的に C# JMP 自動化コードは次のようなことをしたいと考えています。
JMPDatatable の作成 (DT)
ここで、DT は DataTable 型の変数です (C#)
入れ子になった for ループを使用して列と行をループし、JSL にセルごとにデータを入力させて必要な列と行を作成することもできます (これはすぐに試します) が、同じ結果を達成するためのより迅速かつ簡単な方法はあるだろうか?(100,000 行と 100 列なので、迅速かつ効率的なものが必要です)
ありがとう、
Re: C# DataTable 変数から JMP データテーブルを作成するこんにちは、クリスさん
更新していただきありがとうございます。 については考えていませんでしたSetDataVector例で作業するときのメソッド。 良いキャッチです。
この貼り付けが Windows のクリップボード以外から実行できれば便利です。 (つまり、メソッドから渡されるタブ区切りの文字列)。または、データテーブル変数を直接取得して JMP データテーブルに変換できるメソッド。
タブ区切り文字列の形式でテーブルがすでにある場合は、その文字列をファイルに保存し、そのファイルを JMP で開いてみてはいかがでしょうか。 これにより、Windows クリップボードへの依存が解消されます。
あるいは、JSL 変数をタブ区切りの文字列に設定し、Open 関数を使用して文字列から直接テーブルを開くこともできます。 以下はその方法の例です。
tabDelimitedStr = "name age sex height weight
KATIE 12 F 59 95
LOUISE 12 F 61 123
JANE 12 F 55 74";
Open( Char to Blob( tabDelimitedStr ), "text" );
基本的に、クリップボードの代わりに JSL 変数を使用して文字列を渡し、「列名を付けて貼り付け」オプションの代わりに Open 関数を使用してテーブルを作成できます。
Re: C# DataTable 変数から JMP データテーブルを作成するただのアップデートですが、ジャスティン・チルトン、ソリューションは機能しますが、非常に大きなテーブルでは非常に遅くなりました(そして、私のニーズには不十分であることが判明しました)
使用する方がはるかに高速です
JmpDT.GetColumn(ColName).SetDataVector (一度に 1 列を設定します)
それ以外の
jmpDT.GetColumn(col.ColumnName).SetCellVal
一度に 1 つのセルのみを設定します
したがって、必要なのは、データテーブルのデータ列を SetDataVector メソッドに入力する配列に変換するコードだけです。
例: string[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
したがって、このアプローチでは、列を 1 回ループするだけで済みます。
サンプルコード:
for (int i = 0; i < Summary.Columns.Count; i++)
{
文字列 ColName = Summary.Columns[i].ColumnName;
var datatype = Summary.Columns[i].DataType;
if (データ型==typeof(文字列))
{
string[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
JmpDT.GetColumn(ColName).SetDataVector(ColArray);
}
else if (データ型 == typeof(double))
{
double[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
jmpDT.GetColumn(ColName).SetDataVector(ColArray);
}
else if (データ型 == typeof(int))
{
int[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
jmpDT.GetColumn(ColName).SetDataVector(ColArray);
}
else if (データ型 == typeof(float))
{
float[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
jmpDT.GetColumn(ColName).SetDataVector(ColArray);
}
}
この解決策は機能しますが (「SetCellVal」メソッドを使用するよりも桁違いに高速ですが、それでも、アプリケーションの Windows クリップボードからタブ区切りの文字列を貼り付ける場合と比べて、ほぼ 2 倍遅くなります。)
タイムトライアルを行った: ~9000 行、175 列
クリップボードの貼り付けは約 2.5 秒、それ以上の場合は約 4.5 秒
したがって、将来的には、C# データテーブルから JMP にデータを取り込むためのより直接的な方法をリクエストしたいと考えています。
私なら Windows クリップボードを使用しますが、エラー トラップがあっても、Windows クリップボードは一部の PC では不安定で信頼性が低いため、その手法を使用したくないと考えています。
参考までに、Windows のクリップボードにはタブ区切りの文字列が入力され、このコードを使用してデータを JMP に取得します。
command = "dts << ウィンドウを最前面に移動 << 列の選択をクリア << clear select; dts=currentdatatable();";
myJMP.RunCommand(コマンド);
command = "メインメニュー(\"列名を付けて貼り付け\");";
myJMP.RunCommand(コマンド);
この貼り付けが Windows のクリップボード以外から実行できれば便利です。 (つまり、メソッドから渡されるタブ区切りの文字列)。または、データテーブル変数を直接取得して JMP データテーブルに変換できるメソッド。
ご検討をお願いいたします、
クリス
Re: C# DataTable 変数から JMP データテーブルを作成するソリューションへのリンクをありがとう。Visual Studio でコードを正しく確認できました。 ところで、JMP オートメーションは私のソリューションでは正常に動作しますが、サンプル ソリューションではエラーが発生しました。 JMP 13 と Visual Studio 2017 がインストールされています。
GUI 上のいずれかのボタンをクリックすると、次のエラーが表示されます。
System.BadImageFormatException が発生しました
HResult=0x8013101B
メッセージ = ファイルまたはアセンブリ 'Interop.JMP、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null'、またはその依存関係の 1 つを読み込めませんでした。 このアセンブリは、現在読み込まれているランタイムよりも新しいランタイムによってビルドされているため、読み込むことができません。
Source=<例外ソースを評価できません>
スタックトレース:
<例外スタックトレースを評価できません>
Re: C# DataTable 変数から JMP データテーブルを作成する
また、再度の質問で申し訳ありませんが、あなたは基本的に数か月前に私の質問に答えていましたが、昨日の私の古い電子メールの読解スキルはそれほど良くありませんでした。 再度、感謝します!
C# データ テーブル オブジェクトを JMP データ テーブルに変換するための直接パスはありません。 代わりに、JMP オートメーション メソッドを使用して空のテーブルを作成し、C# テーブルの列をループして JMP 列を作成し、次に C# テーブルの行をループして行/列の値を JMP データに追加する必要があります。テーブル。Re: C# DataTable 変数から JMP データテーブルを作成する詳細な回答をありがとうございます。JMP テクニカル サポートは誰にも負けません。
Re: C# DataTable 変数から JMP データテーブルを作成するこんにちは、クリスさん
数か月前にあなたを助けたのは私だったと思います。 私たちの会話から提供されたスニペットは、JMP データ テーブルからの C# DataTable オブジェクトの作成に関するものであり、その逆ではありません。 以下は、C# から JMP への移行について私が述べたことです。
C# データ テーブル オブジェクトを JMP データ テーブルに変換するための直接パスはありません。 代わりに、JMP オートメーション メソッドを使用して空のテーブルを作成し、C# テーブルの列をループして JMP 列を作成し、次に C# テーブルの行をループして行/列の値を JMP データに追加する必要があります。テーブル。
以下は、列と行をループして JMP.DataTable を作成するものです。
class Program
{
static void Main(string[] args)
{
Program p = new Program();
// call method to get sample C# data table
DataTable dt = p.GetTable();
JMP.Application myJMP = new JMP.Application();
myJMP.Visible = true;
myJMP.EnableInteractiveMode(true);
JMP.DataTable jmpDT;
jmpDT = myJMP.NewDataTable("Example");
Object jmpCol;
// add each column to the JMP table
foreach (DataColumn col in dt.Columns)
{
// if its an integer, create numeric column (you may need to check for other Types, such as Decimal or DateTime)
if (col.DataType == System.Type.GetType("System.Int32"))
{
jmpCol = jmpDT.NewColumn(col.ColumnName, JMP.colDataTypeConstants.dtTypeNumeric, 0, 8);
}
else
{
jmpCol = jmpDT.NewColumn(col.ColumnName, JMP.colDataTypeConstants.dtTypeCharacter, 0, 8);
}
}
// add rows to the table
jmpDT.AddRows( (Int16) dt.Rows.Count, 0 );
int i = 1;
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn col in dt.Columns)
{
jmpDT.GetColumn(col.ColumnName).SetCellVal(i, row[col.ColumnName].ToString());
}
i++;
}
}
// From: https://msdn.microsoft.com/en-us/library/9ha04z01(v=vs.110).aspx
private DataTable GetTable()
{
// Create new DataTable.
DataTable table = new DataTable();
// Declare DataColumn and DataRow variables.
DataColumn column;
DataRow row;
// Create new DataColumn, set DataType, ColumnName
// and add to DataTable.
column = new DataColumn();
column.DataType = System.Type.GetType("System.Int32");
column.ColumnName = "id";
table.Columns.Add(column);
// Create second column.
column = new DataColumn();
column.DataType = Type.GetType("System.String");
column.ColumnName = "item";
table.Columns.Add(column);
// Create new DataRow objects and add to DataTable.
for (int i = 0; i < 10; i++)
{
row = table.NewRow();
row["id"] = i;
row["item"] = "item " + i;
table.Rows.Add(row);
}
return table;
}
}
これがお役に立てば幸いです。 さらにご質問がございましたらお知らせください。
ありがとう!
Re: C# DataTable 変数から JMP データテーブルを作成するJMP には C# サンプル プログラムが付属しています。JMP 13 の場合、これは C:\Program Files\SAS\JMP\13\Samples\Automation\Visual CSharp Sample にあります。データテーブルを開く方法を示します。DataTable の Visual Basic オートメーション サンプルでは、新しいテーブルを作成してそこにデータを設定する方法を示します (DataTable 変数をインスタンス化し、NewColumn を使用するだけです)。メソッドは簡単に C# に変換できます。
ブライアン・コーコラン
JMP開発