CsvHelper-使用映射写入SQL数据库

时间:2019-09-27 21:09:43

标签: c# csvhelper

到目前为止,CSVHelper .NET库似乎很棒,但是对于像我这样的伪初学者来说,该文档还是有点缺乏。

我需要读取一个csv文件并将结果写入我们的SQL Server数据库。对于我要写入的表,我需要从CSV列映射到它的列,包括将多个字段串联到一个字段。

这是我读取csv文件所需要的:

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(".", "");
        var records = csv.GetRecords<EntityCsv>().ToList();
    }
}

我的EntityCsv类包含csv文件所有列的属性名称。

然后,我还有一个名为TaskEntity的类,其中包含目标数据库表的属性名称和类型(尽管我不清楚是否需要此属性)。

最后,根据一位同事的建议,我设置了一种利用SQLBulkCopy的方法,如下所示:

public void AddBulk(List<TaskEntity> entities)
{
    using (var con = GetConnection())
    {
        SqlBulkCopy bulk = new SqlBulkCopy(con);
        bulk.BatchSize = 2000;
        bulk.BulkCopyTimeout = 0;
        bulk.DestinationTableName = "dbo.CsvExports";
        bulk.WriteToServer(entities.AsDataTable());
        bulk.Close();
    }
}

我从他那里借了那个代码块,理论上将运行该方法作为最后一步。

但是我知道我之间缺少一个步骤,那就是将字段从csv映射到SQL Server字段。我正在努力实现这一步骤。

因此,为简单起见,我在csv文件中有3列,我想将它们映射到SQL表的2列,如下所示:

CsvColumn1 -> SQLtableColumn1
CsvColumn2 + CsvColumn3 -> SQLtableColumn2

我将如何使用CsvReader和C#完成此工作?我已经浏览了CSVReader文档的“映射”部分,但是我在那里看到的所有内容似乎都是指将列名称从输入文件映射到输出文件中的名称。我在那里(在Google的任何地方)都看不到任何专门用于获取输入文件并将其行导出到SQL数据库的内容。

2 个答案:

答案 0 :(得分:5)

您可以使用ClassMap将csv列映射到sql表列,并跳过CsvEntity类。

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

public class TaskEntity
{
    public int Id { get; set; }
    public string SqlTableColumn1 { get; set; }
    public string SqlTableColumn2 { get; set; }
}

public sealed class TaskEntityMap : ClassMap<TaskEntity>
{
    public TaskEntityMap()
    {
        Map(m => m.SqlTableColumn1).Name("CsvColumn1");
        Map(m => m.SqlTableColumn2).ConvertUsing(row => row.GetField<string>("CsvColumn2") + " " + row.GetField<string>("CsvColumn3"));
    }
}

答案 1 :(得分:0)

我已经使用 SqlBulkCopy csvhelper 将数据转储到sql服务器中。

SqlBulkCopy是一个很棒的实用程序,它几乎可以将任何可加载到DataTable实例中的数据源中的数据写入sql服务器。

var lines = File.ReadAllLines(file);
if (lines.Count() == 0) 
    return;

var tableName = GetTableName(file);
var columns = lines[0].Split(',').ToList();
var table = new DataTable();
sqlBulk.ColumnMappings.Clear();

foreach (var c in columns)
{
    table.Columns.Add(c);
    sqlBulk.ColumnMappings.Add(c, c); 
}

for (int i = 1; i < lines.Count() - 1; i++)
{
    var line = lines[i];
    // Explicitly mark empty values as null for SQL import to work
    var row = line.Split(',')
        .Select(a => string.IsNullOrEmpty(a) ? null : a).ToArray();
    table.Rows.Add(row);
}

sqlBulk.DestinationTableName = tableName;
sqlBulk.WriteToServer(table);