【问题标题】:Datatable from List<Row>来自 List<Row> 的数据表
【发布时间】:2017-05-07 21:09:07
【问题描述】:

我下载了包含在 List&lt;Row&gt; Rows 中的数据,如下所示:

class Row
{
    string[] Items { get; set; }
    public Row(string[] Items)
    {
        this.Items = Items;
    }
}

这些行基本上是逗号分隔的条目 (.csv)

using (var reader = new StreamReader(spreadSheetStream))          
{
    string header = reader.ReadLine(); //This is the header
    Rows.Add(new Row(header.Split(',')));

    while (!reader.EndOfStream)
    {
        string tickerInfo = reader.ReadLine();  //This is a data entry                                             
        Rows.Add(new Row(tickerInfo.Split(',')));                        
    }
}

我像这样将List&lt;Row&gt; 转换成Datatable

DataTable historicalDataTable = ToDataTable<Row>(Rows);

List&lt;Row&gt; Rows 的第一个元素包含列的名称,共有 7 个。那么之后的每个元素都是一个实际的数据元素。

public static DataTable ToDataTable<T>(List<T> items)
{
    DataTable dataTable = new DataTable(typeof(T).Name);

    //Get all the properties
    PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
    foreach (PropertyInfo prop in Props)
    {
        //Setting column names as Property names
        dataTable.Columns.Add(prop.Name);
    }
    foreach (T item in items)
    {
        var values = new object[Props.Length];
        for (int i = 0; i < Props.Length; i++)
        {
            //inserting property values to datatable rows
            values[i] = Props[i].GetValue(item, null);
        }
        dataTable.Rows.Add(values);
    }
    //put a breakpoint here and check datatable
    return dataTable;
}

当我尝试写出表格的内容时,我看到了正确的行数,但是ItemArray中没有任何内容

foreach (DataRow dataRow in historicalDataTable.Rows)
{
    Console.WriteLine(dataRow.ToString());
    foreach (var item in dataRow.ItemArray)
    {
        Console.WriteLine(item);
    }
}

【问题讨论】:

  • 您的 Row 类只有一个属性 (Items)。 ToDataTable&lt;T&gt; 方法将添加一列。这就是你想要达到的目标吗?
  • 嗯,不,我正在尝试添加所有七列。
  • 那么您要么必须更改生成DataTable 的方式,要么使用具有每列属性的强类型类而不是当前的Row 类。
  • 好吧,我不确定你在说什么。代码将每一行上的项目拆分,并将其粘贴在 Rows 数组中。从那里,我试图让 ToTable 正确地将每个字段粘贴到表中。
  • 只需使用CsvHelper 不要开始扭曲自己的 csv 解析器,因为它不像接缝那么容易。

标签: c# csv reflection datatable


【解决方案1】:

您的代码有点矛盾。您正在尝试将属性复制为列名,但是您的 csv 代码实际上将第一行填充为列名。标题行和数据行没有区别

您可以直接将其读入数据表中,例如:-

(尽管您可能希望进行更好的错误检查)

var dt = new DataTable("Rows");
string data = "a,b,c\r\n1,2,3\r\n4,5,6";
var stream = GenerateStreamFromString(data); // http://stackoverflow.com/questions/1879395/how-to-generate-a-stream-from-a-string

using (var reader = new StreamReader(stream))
{
    reader.ReadLine()?.Split(',').ToList().ForEach(h => dt.Columns.Add(h));
    while (!reader.EndOfStream)
    {
        dt.Rows.Add(reader.ReadLine()?.Split(',').ToArray());
    }
}
foreach (DataColumn dataColumn in dt.Columns)
{
    Console.Write($"{dataColumn.ColumnName} ");
}
Console.WriteLine();

foreach (DataRow dataRow in dt.Rows)
{
    Console.Write("Row: ");
    foreach (var item in dataRow.ItemArray)
    {
        Console.Write(item + " ");
    }
    Console.WriteLine();
}

【讨论】:

  • reader.ReadLine()?.Split(',').ToList() "String does not contain a definition of ToList()" 你需要添加对 System.Linq 的引用。跨度>
  • 在您的情况下,ItemArray 中也没有任何内容。
  • 所以添加参考?我将 ToList 更改为 ToArray,它应该可以正常工作:)
猜你喜欢
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 2018-02-03
  • 2011-04-24
  • 2018-03-18
  • 1970-01-01
相关资源
最近更新 更多