Qual è il modo più efficace per creare un datatable JMP da una variabile DataTable C#?Attualmente sto utilizzando gli appunti di Windows per incollare tutte le informazioni in JMP. (C# riempie prima gli appunti) Funziona, ma gli appunti di Windows non sono affidabili e talvolta risultano vuoti.
Ho inviato un ticket di supporto qualche mese fa e ho ricevuto questo messaggio ..
Messaggio di supporto:
...........................
Inoltre, puoi utilizzare i metodi GetTableHandleFromIndex o GetTableHandleFromName per ottenere un riferimento C# all'oggetto di automazione DataTable, come documentato Qui .
...........................
Non ho davvero capito cosa significasse, quando ho letto il link ed ero all'oscuro di cosa fare?
Fondamentalmente codice di automazione C # JMP voglio fare qualcosa del genere:
CreateJMPDatatable (DT)
dove DT è una variabile di tipo DataTable (C#)
Potrei provare i cicli nidificati per scorrere colonne e righe e fare in modo che JSL popola cella per cella e crei colonne e righe necessarie (cosa che proverò presto) ma chiedendomi se esiste un modo più rapido e semplice per ottenere lo stesso risultato?(100.000 righe e 100 colonne, quindi voglio qualcosa di rapido ed efficiente)
Grazie,
Ciao chris,
Grazie per l'aggiornamento. Non ho pensato al ImpostaVettoreDati metodo quando si lavora sull'esempio. Buona pesca.
Sarebbe bello se questo incollaggio potesse essere fatto da qualcosa di diverso dagli appunti di Windows. (cioè una stringa delimitata da tabulazioni passata da un metodo).O un metodo che può prendere direttamente la variabile datatable e convertirla in datatable JMP.
Se hai già la tabella sotto forma di una stringa delimitata da tabulazioni, perché non salvare semplicemente la stringa in un file e aprire quel file in JMP? Ciò eliminerebbe la dipendenza dagli appunti di Windows.
O ancora meglio, potresti semplicemente impostare una variabile JSL sulla stringa delimitata da tabulazioni e utilizzare la funzione Open per aprire la tabella direttamente dalla stringa. Di seguito è riportato un esempio di come farlo.
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" );
Fondamentalmente, puoi usare una variabile JSL invece degli appunti per passare la stringa e la funzione Open per creare la tua tabella invece dell'opzione "Incolla con nomi di colonna".
Solo un aggiornamento, Justin_Chilton , mentre le tue soluzioni funzionano, è stato estremamente lento per tavoli molto grandi (e si è rivelato inadeguato per le mie esigenze)
È molto più veloce da usare
JmpDT.GetColumn(ColName).SetDataVector (che popola 1 colonna alla volta)
invece di
jmpDT.GetColumn(col.ColumnName).SetCellVal
Che popola solo 1 cella alla volta
Quindi hai solo bisogno di codice per convertire le colonne di dati in datatables in array da inserire nel metodo SetDataVector
esempio: string[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
Quindi, con questo approccio, devi solo scorrere le colonne una volta:
Codice d'esempio:
for (int i = 0; i < Summary.Columns.Count; i++)
{
string ColName = Summary.Columns[i].ColumnName;
var datatype = Summary.Columns[i].DataType;
if (tipodati==tipodi(stringa))
{
string[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
JmpDT.GetColumn(ColName).SetDataVector(ColArray);
}
else if (tipodati == typeof(doppio))
{
double[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
jmpDT.GetColumn(ColName).SetDataVector(ColArray);
}
else if (tipodati == typeof(int))
{
int[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
jmpDT.GetColumn(ColName).SetDataVector(ColArray);
}
else if (tipodati == typeof(float))
{
float[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
jmpDT.GetColumn(ColName).SetDataVector(ColArray);
}
}
Sebbene questa soluzione funzioni (ed è ordini di grandezza più veloce rispetto all'utilizzo del metodo "SetCellVal", è comunque quasi due volte più lenta rispetto all'incollare una stringa delimitata da tabulazioni dagli Appunti di Windows per la mia applicazione.
Ho fatto prove a tempo: ~ 9000 righe e 175 colonne
incollare appunti ~ 2,5 secondi, mentre la tecnica sopra ~ 4,5 secondi
Quindi vorrei richiedere in futuro un metodo più diretto per portare i dati in JMP dai datatables C#.
Userei gli appunti di Windows, ma anche con l'intercettazione degli errori, gli appunti di Windows possono essere instabili e inaffidabili su alcuni PC, quindi non vorrei usare quella tecnica.
Cordiali saluti, gli appunti di Windows verrebbero popolati con una stringa delimitata da tabulazioni, quindi utilizzare questo codice per ottenere i dati in JMP.
command = "dts << Porta la finestra in primo piano << Cancella la selezione della colonna << cancella la selezione; dts=currentdatatable();";
myJMP.RunCommand(comando);
comando = "menu principale(\"Incolla con nomi di colonna\");";
myJMP.RunCommand(comando);
Sarebbe bello se questo incollaggio potesse essere fatto da qualcosa di diverso dagli appunti di Windows. (cioè una stringa delimitata da tabulazioni passata da un metodo).O un metodo che può prendere direttamente la variabile datatable e convertirla in datatable JMP.
Grazie per la vostra considerazione,
Chris
Grazie per il collegamento alla soluzione, sono stato in grado di rivedere il codice correttamente in Visual Studio. L'automazione BTW JMP funziona bene nella mia soluzione, ma la soluzione di esempio ha dato un errore. Ho installato JMP 13 e Visual Studio 2017.
Quando faccio clic su qualsiasi pulsante sulla GUI, ottengo questo errore:
System.BadImageFormatException si è verificata
HResult=0x8013101B
Message=Impossibile caricare il file o l'assembly 'Interop.JMP, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' o una delle relative dipendenze. Questo assembly è compilato da un runtime più recente del runtime attualmente caricato e non può essere caricato.
Source=
StackTrace:
Oggetto: Creare un datatable JMP dalla variabile C# DataTable
Inoltre, scusa ancora per la domanda, in sostanza hai risposto alla mia domanda alcuni mesi fa, la mia capacità di leggere le vecchie e-mail ieri non era così buona! Grazie ancora!
Non esiste un percorso diretto per convertire un oggetto tabella dati C# in una tabella dati JMP. Sarà invece necessario utilizzare i metodi di automazione di JMP per creare una tabella vuota, eseguire il ciclo delle colonne della tabella C#, creando le colonne JMP, quindi eseguire il ciclo delle righe della tabella C#, aggiungendo i valori di riga/colonna ai dati JMP Tavolo.Oggetto: Creare un datatable JMP dalla variabile C# DataTableGrazie per la risposta dettagliata, il supporto tecnico di JMP non è secondo a nessuno!
Oggetto: Creare un datatable JMP dalla variabile C# DataTableCiao chris,
Credo di essere stato io ad aiutarti qualche mese fa. Lo snippet che hai fornito dalla nostra conversazione si riferiva alla creazione di un oggetto DataTable C# da una tabella di dati JMP, non viceversa. Di seguito è riportato ciò che ho detto sul passaggio da C# a JMP.
Non esiste un percorso diretto per convertire un oggetto tabella dati C# in una tabella dati JMP. Sarà invece necessario utilizzare i metodi di automazione di JMP per creare una tabella vuota, eseguire il ciclo delle colonne della tabella C#, creando le colonne JMP, quindi eseguire il ciclo delle righe della tabella C#, aggiungendo i valori di riga/colonna ai dati JMP Tavolo.
Ecco qualcosa che ho messo insieme che scorre attraverso le colonne e le righe per creare 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;
}
}
Spero che questo sia utile. Fammi sapere se hai altre domande.
Grazie!
Oggetto: Creare un datatable JMP dalla variabile C# DataTableJMP viene fornito con un programma di esempio C#.Per JMP 13, si trova in C:\Program Files\SAS\JMP\13\Samples\Automation\Visual CSharp Sample.Questo mostrerà come aprire una tabella di dati.L'esempio di automazione di Visual Basic per DataTable illustrerà i metodi per creare una nuova tabella e popolarla (basta creare un'istanza di una variabile DataTable e usare NewColumn).I metodi sono facilmente traducibili in C#.
Brian Corcoran
Sviluppo JMP