c# - 来自 List<Row> 的数据表

标签 c# csv reflection datatable

我已经下载了包含在 List<Row> 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<Row>进入 Datatable像这样

DataTable historicalDataTable = ToDataTable<Row>(Rows);

List<Row> Rows的第一个元素包含列的名称,其中有七个。那么此后的每个元素都是一个实际的数据元素。

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);
    }
}

最佳答案

你的代码有点矛盾。您正在尝试将属性复制为列名,但是您的 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();
}

关于c# - 来自 List<Row> 的数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43836744/

相关文章:

c# - 简化后台 worker 的匿名方法

c# - StructureMap 针对所有可能的具体实现注册通用类型

xml - 解析 XML 并找到字符串的所有实例

mysql - 我如何在我的 CSV 中将 ,, 正则表达式表示为 ,\N, 以便 mysqlimport 理解它们?

通过 IEnumerable 扩展方法进行 C# LINQ 调试

c# - 如何在 C# 中向上或向下舍入?

Python CSV 阅读器和迭代

c++ - Lua - 反射 - 获取对象上的函数/字段列表?

c# - .NET Core 中的 MethodInfo ReflectedType

c# - 获取一系列对象中所有属性的默认值的通用解决方案