使用 CsvHelper 读取带有 headers 的 CSV 并按列名引用导入的数据
Using CsvHelper to read a CSV with headers and refer to imported data by column name
我正在导入 .CSV 文件,用户可以在列和名称上进行配置。
在我这边,我将动态处理数据/将数据导入数据库,但我需要将列与其 header 名称匹配。
此外,这是 运行 作为一项服务,所以我需要异步方法。
看起来 CsvDataReader (https://joshclose.github.io/CsvHelper/examples/data-table) 可能是我正在寻找的东西,但我没有看到异步方法。
例如,我的 CSV 文件可能如下所示:
id,first,last
101,john,doe
..
我需要在代码方面做的是:(原型/"ideal")
foreach( var item in csvRead)
{
column = csvRead.columnName;
value = csvRead.value;
DBWrite(column, value);
}
这可能与 CsvHelper 相关吗? (最重要的是,异步是否存在必要的 类?)
您可以使用动态对象。
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}");
}
我正在导入 .CSV 文件,用户可以在列和名称上进行配置。
在我这边,我将动态处理数据/将数据导入数据库,但我需要将列与其 header 名称匹配。
此外,这是 运行 作为一项服务,所以我需要异步方法。
看起来 CsvDataReader (https://joshclose.github.io/CsvHelper/examples/data-table) 可能是我正在寻找的东西,但我没有看到异步方法。
例如,我的 CSV 文件可能如下所示:
id,first,last
101,john,doe
..
我需要在代码方面做的是:(原型/"ideal")
foreach( var item in csvRead)
{
column = csvRead.columnName;
value = csvRead.value;
DBWrite(column, value);
}
这可能与 CsvHelper 相关吗? (最重要的是,异步是否存在必要的 类?)
您可以使用动态对象。
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}");
}