C# DataTable 변수에서 JMP 데이터 테이블 생성C# DataTable 변수에서 JMP 데이터 테이블을 생성하는 가장 효율적인 방법은 무엇입니까?현재 Windows 클립보드를 사용하여 모든 정보를 JMP에 붙여넣고 있습니다. (C# 먼저 클립보드 채우기) 이것은 작동하지만 Windows 클립보드는 신뢰할 수 없으며 때때로 비어 있습니다.
몇 달 전에 지원 티켓을 보냈는데 이런 메시지를 받았습니다..
지원 메시지:
...........................
또한 문서화된 대로 GetTableHandleFromIndex 또는 GetTableHandleFromName 메서드를 사용하여 DataTable 자동화 개체에 대한 C# 참조를 가져올 수 있습니다. 여기 .
...........................
나는 이것이 무엇을 의미하는지 이해하지 못했습니다. 링크를 읽었을 때 무엇을 해야할지 몰랐습니까?
기본적으로 C# JMP 자동화 코드는 다음과 같습니다.
CreateJMPDatatable(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
한 번에 하나의 셀만 채웁니다.
따라서 데이터 테이블의 데이터 열을 배열로 변환하여 SetDataVector 메서드에 공급하는 코드만 있으면 됩니다.
예: string[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
따라서 이 접근 방식을 사용하면 열을 한 번만 반복하면 됩니다.
샘플 코드:
for (int i = 0; i < Summary.Columns.Count; i++)
{
string 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);
}
그렇지 않으면 (데이터 유형 == typeof(double))
{
double[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
jmpDT.GetColumn(ColName).SetDataVector(ColArray);
}
그렇지 않으면 (데이터 유형 == typeof(int))
{
int[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
jmpDT.GetColumn(ColName).SetDataVector(ColArray);
}
그렇지 않으면 (데이터 유형 == typeof(float))
{
float[] ColArray = Summary.AsEnumerable().Select(rw => rw.Field(ColName)).ToArray();
jmpDT.GetColumn(ColName).SetDataVector(ColArray);
}
}
이 솔루션이 작동하고 "SetCellVal" 방법을 사용하는 것보다 몇 배 더 빠르지만 내 응용 프로그램의 Windows 클립보드에서 탭으로 구분된 문자열을 붙여넣는 것보다 여전히 거의 두 배나 느립니다.
저는 타임 트라이얼을 했습니다: ~9000개의 행과 175개의 열
클립보드 붙여넣기 ~2.5초, 위 기술은 ~4.5초
그래서 앞으로 C# 데이터 테이블에서 JMP로 데이터를 가져오는 보다 직접적인 방법을 요청하고 싶습니다.
Windows 클립보드를 사용하고 싶지만 오류 트래핑이 있더라도 Windows 클립보드는 불안정하고 일부 PC에서는 불안정할 수 있으므로 해당 기술을 사용하고 싶지 않습니다.
FYI WIndows 클립보드는 탭으로 구분된 문자열로 채워진 다음 이 코드를 사용하여 데이터를 JMP로 가져옵니다.
command = "dts << 창을 맨 앞으로 가져오기 << 열 선택 지우기 << 선택 지우기; dts=currentdatatable();";
myJMP.RunCommand(명령);
command = "main menu(\"열 이름으로 붙여넣기\");";
myJMP.RunCommand(명령);
이 붙여넣기가 Windows 클립보드가 아닌 다른 것에서 수행될 수 있다면 좋을 것입니다. (즉, 메서드에서 전달된 탭으로 구분된 문자열).또는 데이터 테이블 변수를 직접 가져와서 JMP 데이터 테이블로 변환할 수 있는 방법입니다.
당신의 배려에 감사합니다,
크리스
Re: C# DataTable 변수에서 JMP 데이터 테이블 생성솔루션에 대한 링크 덕분에 Visual Studio에서 코드를 잘 검토할 수 있었습니다. BTW JMP 자동화는 내 솔루션에서 제대로 실행되지만 샘플 솔루션에서 오류가 발생했습니다. JMP 13과 Visual Studio 2017이 설치되어 있습니다.
GUI에서 아무 버튼이나 클릭하면 다음 오류가 발생합니다.
System.BadImageFormatException 발생
HResult=0x8013101B
Message=파일 또는 어셈블리 'Interop.JMP, 버전=1.0.0.0, Culture=중립, PublicKeyToken=null' 또는 해당 종속성 중 하나를 로드할 수 없습니다. 이 어셈블리는 현재 로드된 런타임보다 새로운 런타임에 의해 빌드되었으며 로드할 수 없습니다.
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 개발