【发布时间】:2020-01-31 01:47:44
【问题描述】:
在 .NET Core 2.2 中使用 CSVHelper .NET 库来解析大型 csv 文件(超过 100 万行)并将其写入 SQL Server 表。
我有两个映射类:我们需要循环遍历每一行,如果该行的第一个值为1,我们需要使用类映射1,如果值为2,我们需要使用类映射2 . 因为 CSVHelper 适合批量执行此活动,所以我无法概念化如何使用 if 语句和 for each 循环来完成此任务。
这是我目前所拥有的:
SQL 实体类
public class TaskEntity
{
public int Id { get; set; }
public string SqlTableColumn1 { get; set; }
public string SqlTableColumn2 { get; set; }
}
CSVHelper 映射类 1
public sealed class TaskEntityMap1 : ClassMap<TaskEntity>
{
public TaskEntityMap1()
{
Map(m => m.SqlTableColumn1).Name("CsvColumn1");
Map(m => m.SqlTableColumn2).ConvertUsing(row => row.GetField<string>("CsvColumn2") + " " + row.GetField<string>("CsvColumn3"));
}
}
CSVHelper 映射类 2
public sealed class TaskEntityMap2 : ClassMap<TaskEntity>
{
public TaskEntityMap2()
{
Map(m => m.SqlTableColumn1).Name("CsvColumn4");
Map(m => m.SqlTableColumn2).ConvertUsing(row => row.GetField<string>("CsvColumn5") + " " + row.GetField<string>("CsvColumn6"));
}
}
Program.cs(这是我们在获得条件映射要求之前所拥有的)
public static void Main(string[] args)
{
using (var reader = new StreamReader(@"C:\Users\me\Documents\file.csv"))
using (var csv = new CsvReader(reader))
{
csv.Configuration.PrepareHeaderForMatch = (string header, int index) =>
header.Replace(" ", "_").Replace("(", "").Replace(")", "").Replace(".", "");
csv.Configuration.RegisterClassMap<TaskEntityMap>();
var records = csv.GetRecords<TaskEntity>().ToList();
}
}
由于Program.cs 代码的上述示例演示了 CSVHelper 似乎设计用于的典型易用性场景,我很难概念化如何使用两个类映射,以及如何循环遍历每一行的 csv 文件并根据给定行中的列中的值选择类映射。
【问题讨论】: