通过COM将DataTable传递到R中

3
我正在尝试将数据从SQL传递到C#,然后传递到R服务器进行数据分析,最后再返回到我的Web应用程序; 但是,我正在使用的COM接口不允许在C#和R之间传递复杂的数据类型(没有数据表)。 我曾经通过使用以下代码使其正常工作:
    int count = dataTable.Rows.Count;
    object[] y = new object[count];
    object[] x = new object[count];

    //R does not accept DataTables, so here we extract the data from
    //the table and pass it into 2 double arrays.
    for (int i = 0; i < count; i++)
    {
        y[i] = Convert.ToDouble(dataTable.Rows[i][0]);
        x[i] = Convert.ToDouble(dataTable.Rows[i][1]);
    }
    //Instantiate R connection
    StatConnector r = new STATCONNECTORSRVLib.StatConnectorClass();
    r.Init("R");
    r.SetSymbol("y", y);  //Passes column y into R
    r.SetSymbol("x", x);  //Passes column x into R

我的问题现在出现了,因为我不再局限于仅使用double类型,从SQL数据库中获取的任何数据都可以使用(int、varchar等),而且我不再只调用2列数据(它可以是用户指定的任意数量)。

如何将一个动态大小和动态数据类型的datatable转换为一个数组,以便安全地传递到rcom中?

2个回答

2
我会使用CSV格式。当然,我对RCOM一无所知:s 祝你好运!
public static string DataTableToCSV(DataTable myTable)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < myTable.Columns.Count; i++)
    {
        sb.Append("\"");
        sb.Append(myTable.Columns[i].ColumnName);
        sb.Append("\"");
        if (i < myTable.Columns.Count - 1)
            sb.Append(",");
    }
    sb.AppendLine();
    foreach (DataRow dr in myTable.Rows)
    {
        for (int i = 0; i < dr.ItemArray.Length; i++)
        {
            sb.Append("\"");
            sb.Append(dr.ItemArray[i].ToString());
            sb.Append("\"");
            if (i < dr.ItemArray.Length - 1)
                sb.Append(",");
        }
        sb.AppendLine();
    }
    return sb.ToString();
}

2

这就是它(我也可以让CSV解决方案起作用,但你的想法少了一步)。R自动检测CSV的数据类型,因此它应该能够对字符串矩阵执行相同的操作。非常感谢,事后看起来总是那么显而易见! - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接