使用CsvHelper读取带标题的CSV并按列名引用导入的数据

时间:2019-04-23 13:27:12

标签: csvhelper

我正在导入.CSV文件,该文件将由用户在列和名称上进行配置。

在我这边,我将动态地将数据处理/导入到数据库中,但是我需要将列与其标题名称匹配。

此外,它作为服务运行,因此我需要异步方法。

看起来CsvDataReader(https://joshclose.github.io/CsvHelper/examples/data-table)可能是我正在寻找的东西,但是我没有看到异步方法。

例如,我可能有一个看起来像这样的CSV:

id,first,last
101,john,doe
..

在代码方面,我需要做的是:(原型/“理想”)

foreach( var item in csvRead)
{
    column = csvRead.columnName;
    value = csvRead.value;
    DBWrite(column, value);
}

这可能与CsvHelper有关吗? (最重要的是,异步是否存在必需的类?)

1 个答案:

答案 0 :(得分:1)

您可以使用动态对象。

public async Task WriteRecords()
{
    using (MemoryStream stream = new MemoryStream())
    using (StreamWriter writer = new StreamWriter(stream))
    using (StreamReader reader = new StreamReader(stream))
    using (CsvReader csv = new CsvReader(reader))
    {
        writer.WriteLine("id,first,last");
        writer.WriteLine("101,john,doe");
        writer.Flush();
        stream.Position = 0;

        await csv.ReadAsync();

        csv.ReadHeader();

        while (await csv.ReadAsync())
        {
            var record = csv.GetRecord<dynamic>();

            foreach (var item in (IDictionary<string, object>)record)
            {
                DBWrite(item.Key, item.Value);
            }
        }
    }
}

public void DBWrite(string column, object value)
{
    Console.WriteLine($"Storing {column}: {value}");
}