Quelle est la manière la plus efficace de créer une table de données JMP à partir d'une variable C# DataTable ?J'utilise actuellement le presse-papiers de Windows pour coller toutes les informations dans JMP. (C# remplissant d'abord le presse-papiers) Cela fonctionne, mais le presse-papiers de Windows n'est pas fiable et est parfois vide.
J'ai envoyé un ticket d'assistance il y a quelques mois et j'ai reçu ce message.
Message d'assistance :
................................
En outre, vous pouvez utiliser les méthodes GetTableHandleFromIndex ou GetTableHandleFromName pour obtenir une référence C # à l'objet d'automatisation DataTable, comme documenté ici .
................................
Je n'ai pas vraiment compris ce que cela signifiait, quand j'ai lu le lien et que je ne savais pas quoi faire?
Fondamentalement, le code d'automatisation C # JMP je veux faire quelque chose comme ceci:
CréerJMPDatatable (DT)
où DT est une variable de type DataTable (C#)
Je pourrais essayer des boucles imbriquées pour parcourir les colonnes et les lignes et demander à JSL de remplir cellule par cellule et de créer les colonnes et les lignes nécessaires (ce que j'essaierai bientôt), mais je me demande s'il existe un moyen plus rapide et plus simple d'obtenir le même résultat ?(100 000 lignes et 100 colonnes, donc je veux quelque chose de rapide et efficace)
Merci,
Salut chris,
Merci pour la mise à jour. je n'ai pas pensé à la SetDataVector méthode lorsque vous travaillez sur l'exemple. Bonne prise.
Ce serait bien si ce collage pouvait être fait à partir d'autre chose que le presse-papiers de Windows. (c'est-à-dire une chaîne délimitée par des tabulations passée à partir d'une méthode).Ou une méthode qui peut prendre directement une variable de table de données et la convertir en table de données JMP.
Si vous avez déjà le tableau sous la forme d'une chaîne délimitée par des tabulations, pourquoi ne pas simplement enregistrer la chaîne dans un fichier et ouvrir ce fichier dans JMP ? Cela supprimerait la dépendance au presse-papiers de Windows.
Ou mieux encore, vous pouvez simplement définir une variable JSL sur la chaîne délimitée par des tabulations et utiliser la fonction Open pour ouvrir la table directement à partir de la chaîne. Vous trouverez ci-dessous un exemple de la façon de procéder.
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" );
Fondamentalement, vous pouvez utiliser une variable JSL au lieu du presse-papiers pour transmettre la chaîne et la fonction Ouvrir pour créer votre table au lieu de l'option "Coller avec les noms de colonne".
Juste une mise à jour, Justin_Chilton , bien que vos solutions fonctionnent, elles étaient extrêmement lentes pour les très grandes tables (et se sont avérées inadéquates pour mes besoins)
C'est beaucoup plus rapide à utiliser
JmpDT.GetColumn(ColName).SetDataVector (qui remplit 1 colonne à la fois)
au lieu de
jmpDT.GetColumn(col.ColumnName).SetCellVal
Qui ne remplit qu'une cellule à la fois
Vous avez donc juste besoin de code pour convertir les colonnes de données dans les tables de données en tableau pour alimenter la méthode SetDataVector
exemple : string[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
Ainsi, avec cette approche, vous n'avez besoin de parcourir les colonnes qu'une seule fois :
exemple de code :
for (int i = 0; i < Summary.Columns.Count; i++)
{
chaîne ColName = Summary.Columns[i].ColumnName ;
var type de données = Summary.Columns[i].DataType ;
si (type de données == type de (chaîne))
{
chaîne[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
JmpDT.GetColumn(ColName).SetDataVector(ColArray);
}
sinon si (type de données == typeof(double))
{
double[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
jmpDT.GetColumn(ColName).SetDataVector(ColArray);
}
sinon si (type de données == typeof(int))
{
int[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
jmpDT.GetColumn(ColName).SetDataVector(ColArray);
}
sinon si (type de données == typeof(float))
{
float[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
jmpDT.GetColumn(ColName).SetDataVector(ColArray);
}
}
Bien que cette solution fonctionne (et soit des ordres de grandeur plus rapide que l'utilisation de la méthode "SetCellVal", elle est toujours presque deux fois plus lente que de coller une chaîne délimitée par des tabulations à partir du presse-papiers Windows pour mon application.
J'ai fait des contre-la-montre : ~9000 lignes et 175 colonnes
coller le presse-papiers ~ 2,5 s, tandis que la technique ci-dessus ~ 4,5 s
J'aimerais donc demander à l'avenir une méthode plus directe pour importer des données dans JMP à partir de tables de données C#.
J'utiliserais le presse-papiers de Windows, mais même avec le piégeage d'erreurs, le presse-papiers de Windows peut être floconneux et peu fiable sur certains PC, donc je ne voudrais pas utiliser cette technique.
Le presse-papiers FYI WIndows serait rempli avec une chaîne délimitée par des tabulations, puis utiliser ce code pour obtenir des données dans JMP.
command = "dts << Amener la fenêtre au premier plan << Effacer la sélection de colonne << clear select; dts=currentdatatable();";
myJMP.RunCommand(commande);
command = "main menu(\"Coller avec les noms de colonnes\");";
myJMP.RunCommand(commande);
Ce serait bien si ce collage pouvait être fait à partir d'autre chose que le presse-papiers de Windows. (c'est-à-dire une chaîne délimitée par des tabulations passée à partir d'une méthode).Ou une méthode qui peut prendre directement une variable de table de données et la convertir en table de données JMP.
Merci pour votre considération,
Chris
Merci pour le lien vers la solution, j'ai pu examiner le code correctement dans Visual Studio. L'automatisation BTW JMP fonctionne correctement dans ma solution, mais l'exemple de solution a généré une erreur. J'ai installé JMP 13 et visual studio 2017.
Lorsque je clique sur n'importe quel bouton de l'interface graphique, j'obtiens cette erreur :
System.BadImageFormatException s'est produite
HRésultat=0x8013101B
Message=Impossible de charger le fichier ou l'assembly 'Interop.JMP, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' ou l'une de ses dépendances. Cet assembly est construit par un runtime plus récent que le runtime actuellement chargé et ne peut pas être chargé.
Source=
Trace de la pile:
Re : Créer une table de données JMP à partir de la variable C# DataTable
Aussi, désolé pour la question à nouveau, vous aviez essentiellement répondu à ma question il y a quelques mois, mes compétences en lecture d'anciens e-mails n'étaient pas si bonnes hier ! Merci encore!
Il n'existe pas de chemin direct pour convertir un objet de table de données C# en table de données JMP. Au lieu de cela, vous devrez utiliser les méthodes JMP Automation pour créer une table vide, parcourir les colonnes de la table C#, créer les colonnes JMP, puis parcourir les lignes de la table C#, en ajoutant les valeurs de ligne/colonne aux données JMP. Tableau.Re : Créer une table de données JMP à partir de la variable C# DataTableMerci pour la réponse détaillée, le support technique de JMP est sans égal !
Re : Créer une table de données JMP à partir de la variable C# DataTableSalut chris,
Je crois que c'est moi qui t'ai aidé il y a quelques mois. L'extrait que vous avez fourni à partir de notre conversation faisait référence à la création d'un objet C# DataTable à partir d'une table de données JMP, et non l'inverse. Voici ce que j'ai dit sur le passage de C# à JMP.
Il n'existe pas de chemin direct pour convertir un objet de table de données C# en table de données JMP. Au lieu de cela, vous devrez utiliser les méthodes JMP Automation pour créer une table vide, parcourir les colonnes de la table C#, créer les colonnes JMP, puis parcourir les lignes de la table C#, en ajoutant les valeurs de ligne/colonne aux données JMP. Tableau.
Voici quelque chose que j'ai rassemblé qui parcourt les colonnes et les lignes pour créer un 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;
}
}
J'espère que ceci est utile. Dis moi si tu as d'autres questions.
Merci!
Re : Créer une table de données JMP à partir de la variable C# DataTableJMP est livré avec un exemple de programme C#.Pour JMP 13, il se trouve dans C:\Program Files\SAS\JMP\13\Samples\Automation\Visual CSharp Sample.Cela montrera comment ouvrir une table de données.L'exemple d'automatisation Visual Basic pour DataTable illustrera les méthodes permettant de créer une nouvelle table et de la remplir (instanciez simplement une variable DataTable et utilisez NewColumn).Les méthodes sont facilement traduites en C#.
Brian Corcoran
Développement JMP