C# CSVHelper-使用两个映射类,并根据csv文件每行字段中的值选择映射

C# CSVHelper-使用两个映射类,并根据csv文件每行字段中的值选择映射,c#,csvhelper,C#,Csvhelper,使用带有.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 {

使用带有.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"));
    }
}
公共密封类TaskEntityMap1:ClassMap
{
公共任务EntityMap1()
{
Map(m=>m.SqlTableColumn1).Name(“CsvColumn1”);
Map(m=>m.SqlTableColumn2).ConvertUsing(row=>row.GetField(“CsvColumn2”)+“”+row.GetField(“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"));
    }
}
公共密封类TaskEntityMap2:ClassMap
{
公共任务EntityMap2()
{
Map(m=>m.SqlTableColumn1.Name(“CsvColumn4”);
Map(m=>m.SqlTableColumn2).ConvertUsing(row=>row.GetField(“CsvColumn5”)+“”+row.GetField(“CsvColumn6”);
}
}
Program.cs(这是我们在获得条件映射要求之前所拥有的)

publicstaticvoidmain(字符串[]args)
{
使用(var reader=newstreamreader(@“C:\Users\me\Documents\file.csv”))
使用(var csv=新的CsvReader(读卡器))
{
csv.Configuration.prepareHeadePerformatch=(字符串头,整数索引)=>
标题。替换(“,”)。替换(“,”)。替换(“),”)。替换(“),”)。替换(“,”);
csv.Configuration.RegisterClassMap();
var records=csv.GetRecords().ToList();
}
}

正如上面的
Program.cs
代码示例演示了CSVHelper设计的典型易用性场景,我很难概念化如何使用两个类映射,以及如何循环浏览csv文件的每一行,并根据给定行中某列中的值选择类映射。

当我最初听到您的要求时,我认为您只需要为每个文档检查一次
类映射。现在听起来好像每行都会改变。不幸的是,我发现一旦你注册并开始使用
ClassMap
,它似乎会被缓存,你不能中途切换,所以我认为这两个
ClassMap
不起作用。我会给你一些方法来解决它,你可以让我知道,如果任何一个满足你的要求

publicstaticvoidmain(字符串[]args)
{
使用(var reader=newstreamreader(@“C:\Users\me\Documents\file.csv”))
使用(var csv=新的CsvReader(读卡器))
{
csv.Configuration.prepareHeadePerformatch=(字符串头,整数索引)=>
标题。替换(“,”)。替换(“,”)。替换(“),”)。替换(“),”)。替换(“,”);
csv.Configuration.RegisterClassMap();
var records=csv.GetRecords().ToList();
}
}
公共密封类TaskEntityMap:ClassMap
{
公共任务EntityMap()
{
映射(m=>m.SqlTableColumn1).ConvertUsing(行=>row.GetField(0)==1?
row.GetField(“CsvColumn1”):
row.GetField(“CsvColumn4”)
);
映射(m=>m.SqlTableColumn2).ConvertUsing(行=>row.GetField(0)==1?
row.GetField(“CsvColumn2”)+“”+row.GetField(“CsvColumn3”):
row.GetField(“CsvColumn5”)+“”+row.GetField(“CsvColumn6”)
);
}
}
另一个选项是手动构造
任务实体
对象

publicstaticvoidmain(字符串[]args)
{
使用(var reader=newstreamreader(@“C:\Users\me\Documents\file.csv”))
使用(var csv=新的CsvReader(读卡器))
{
csv.Configuration.prepareHeadePerformatch=(字符串头,整数索引)=>
标题。替换(“,”)。替换(“,”)。替换(“),”)。替换(“),”)。替换(“,”);
var记录=新列表();
csv.Read();
csv.ReadHeader();
而(csv.Read())
{                    
如果(csv.GetField(0)==1)
{
var记录=新任务实体
{
SqlTableColumn1=csv.GetField(“CsvColumn1”),
SqlTableColumn2=csv.GetField(“CsvColumn2”)+“”+csv.GetField(“CsvColumn3”)
};
记录。添加(记录);
}
其他的
{
var记录=新任务实体
{
SqlTableColumn1=csv.GetField(“CsvColumn4”),
SqlTableColumn2=csv.GetField(“CsvColumn5”)+“”+csv.GetField(“CsvColumn6”)
};
记录。添加(记录);
}                    
}
}//在这里休息。
}

你好,大卫。看看你的第一个选项,理论上我似乎可以在lambda表达式中建立一个if条件?我先试试这个。是的,事实上,如果你有多种可能性,你可以设置一个switch或elseif语句。或者您可以通过另一种方法处理并返回值。David,出于各种原因,我决定尝试您的第二个选项。我正试图在Visual Studio中调试它(我还没有导出到数据库),但我在检查VS中的
记录时遇到了问题-我是否需要添加某种返回语句以便在任何VS调试窗口(如Autos)中显示一些结果?如果你不知道,我对这一切还是比较陌生的,所以非常感谢你的帮助!在调试过程中,我没有收到任何错误-只是看不到任何值的指示,这些值指示它的错误
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();
    }
}