【问题标题】:Fastest way to compare CSV file to database in c#在 C# 中将 CSV 文件与数据库进行比较的最快方法
【发布时间】:2013-01-11 01:34:59
【问题描述】:

我正在编写一个内部应用程序,其中一个功能是从远程系统导入数据。来自远程系统的数据以 CSV 文件的形式出现。我需要将系统中的数据与 CSV 文件中的数据进行比较。

我需要对我的系统应用任何更改(添加和更改)。我需要跟踪每个更改的字段。

我的数据库是规范化的,所以我要处理大约 10 个表来对应 CSV 文件中的数据。实现这一点的最佳方法是什么?每个 CSV 文件每天处理大约 500,000 条记录。我首先使用查找 ID 从我的 SQL 数据库中逐行查询,然后使用 c# 逐字段进行比较,并根据需要进行更新或插入;但是,这需要的时间太长了。

有什么建议吗?

【问题讨论】:

  • 将所有 CSV 数据插入数据库中并进行表格比较或相反,将所有数据库数据导出为 CSV 并进行文件比较。
  • 你有什么可以作为唯一键的吗?
  • 我有一个作为唯一键的字段。如果我尝试从数据库中提取所有数据,大约 10 个规范化表,则需要太多时间和内存。我想在 c# 代码中进行大部分比较(如果不是全部的话),因为我想将我的数据库排除在外,并在更新时应用特殊的业务规则。

标签: c# sql compare


【解决方案1】:

您可以执行以下操作:

  • 将 cvs 文件加载到数据库中的暂存表中;
  • 对其执行验证和清理例程(如有必要)
  • 对实时数据进行比较和更新
  • 清除暂存表中的所有数据

使用这种方法,您可以使用您的 RDBMS 功能实现几乎所有的清理、验证和更新逻辑。

如果您的 RDBMS 是 SQL Server,您可以利用 SQL Server Integration Services。

【讨论】:

  • +1 使用 bcp 或 csvreader.com 之类的 .net 库将数据快速加载到临时表中。
【解决方案2】:

如果您有任何东西可以用作唯一键,您可以执行以下操作:

  • 创建一个新表 Hashes,其中包含唯一键和与该键关联的所有字段的散列(不要使用 .NET 的 object.GetHashCode(),因为返回的值会随时间而变化时间设计。我个人使用我移植到 C# 的 Google 的 CityHash)。
  • 当您获得一个新的 CSV 文件时,计算每个键的哈希值
  • 检查 CSV 文件中每一行的哈希表。
  • 如果唯一键没有条目,则创建一个并插入该行。
  • 如果有条目,请查看哈希是否已更改。
  • 如果有,更新哈希表中的哈希并更新数据。

【讨论】:

    【解决方案3】:

    扩展对您问题的第一条评论。

    创建一个与您的 csv 文件格式匹配的适当索引表,并将数据直接转储到其中。

    有一个带有适当查询的存储过程来更新/删除/插入活动表。

    摆脱临时表。

    【讨论】:

      猜你喜欢
      • 2017-12-25
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 2022-01-17
      相关资源
      最近更新 更多