【问题标题】:.NET Core WebApi CSV File parsing and storing in DB.NET Core WebApi CSV 文件解析和存储在数据库中
【发布时间】:2020-04-14 10:07:38
【问题描述】:

我正在使用 .NET Core WebApi 和 EF Core。

我有以下场景:

  • 我有一个接受 CSV 文件的端点
  • 此 CSV 文件包含超过 15.000 行
  • 我需要解析这个 CSV 文件并将每一行存储在我的数据库中
  • 在存储每一行​​之前,我需要检查其中的数据是否已经存在(如果它们作为独立实体存在,则需要检查每行 4-5 个值)

我的问题:

  1. 检查数据是否存在,需要很长时间(15.000 次 4-5 次检查...)

所以我想创建一些任务来将批处理存储在数据库中(但在 .NET Core WebApi 中)你不能运行后台任务,对吧?

你们将如何实现这一目标?

【问题讨论】:

  • 您可以使用批量复制程序将数据上传到临时表中,然后将数据查询到相应的表中。这对于批量操作要快得多。
  • 您看到文件变大了吗?当这从 15K 行变为 15M 行或 15B 行时会发生什么?如果是这种情况,使用 ETL 流程可能是更好的选择。
  • 您进行检查的表有多大,您不能将其全部加载到内存中吗?至少 4-5 列..
  • @RajMore 这到底是什么意思(ETL)?
  • Here 是错误的一些线索

标签: .net entity-framework asp.net-core asp.net-web-api


【解决方案1】:

一种方法是使用SqlBulkCopy 将数据上传到临时表中,然后将数据查询到相应的表中。例如:

  1. 创建临时表
await connection.ExecuteAsync(@"CREATE TABLE #TempTable
(
    [X] int NULL,
    [Y] nvarchar(100) NULL,
    [Z] datetime NULL
)", null, transaction);

  1. 创建 DataTable 并填充 CSV 数据
DataTable table = new DataTable();

dataTable.Columns.Add("X", typeof(int));
dataTable.Columns.Add("Y", typeof(string));
dataTable.Columns.Add("Z", typeof(DateTime));

//foreach csv record...

var row = dataTable.NewRow();

row["X"] = 1;
row["Y"] = "test";
row["Z"] = DateTime.Now;

dataTable.Rows.Add(row);

  1. 执行批量复制
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
{
    bulkCopy.DestinationTableName = "#TempTable";
    bulkCopy.EnableStreaming = true;

    await bulkCopy.WriteToServerAsync(dataTable);
}
  1. 将临时表中的数据查询到目标表中。 您可以在此处执行现有记录检查。
  2. 删除临时表
await connection.ExecuteAsync("DROP TABLE #TempTable", null, transaction);

我发现这种方法比 EF 更快地将数据批量导入数据库,同时维护一些业务逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    相关资源
    最近更新 更多