【问题标题】:What is the fastest way of comparing two huge CSV files for a change?比较两个巨大的 CSV 文件以进行更改的最快方法是什么?
【发布时间】:2012-10-28 17:43:48
【问题描述】:

我认为这是一个架构和/或设计相关的问题:

我的场景是

"

  • 我将大量数据从 Db 导出到 CSV。
  • 我经常这样做。
  • 我想检查最后导出的 CSV 数据是否不同于 之前导出数据的内容”

我怎样才能做到这一点(无需逐行循环和比较)?

注意事项

  • 我的导出器是一个 .Net 控制台应用程序。

  • 我的数据库是 MS-SQL(如果你需要知道的话)

  • 我的导出器在 PowerShell 脚本中作为计划任务定期运行

【问题讨论】:

  • 我正在考虑使用校验和作为一种选择...
  • 你能把这点作为你问题的一部分吗,不需要评论:)
  • 好吧,我不想通过指出来影响意见......也许有比校验和更好的选择,我不想阻止这些想法:)

标签: c# .net powershell architecture


【解决方案1】:

听起来您只想生成每个 CSV 文件的校验和以进行比较。
Calculate MD5 checksum for a file

using (var md5 = MD5.Create())
{
    using (var stream = File.OpenRead(filename))
    {
        return md5.ComputeHash(stream);
    }
}

【讨论】:

  • 我同意这个想法 - 甚至可以提前计算每次导出的校验和 - 将校验和保存在数据库的“export_history”表中,这样您就可以永久记录每次导出。跨度>
  • 我喜欢 Export_History 的想法
【解决方案2】:

您可以让数据库跟踪上次修改的时间。只需向该表添加一个触发器,每当添加/删除/更新任何项目时,您都可以将特定值设置为当前时间。然后,您首先不需要比较大文件;您的导出作业可以简单地查询上次修改时间,将其与文件系统上文件的上次修改时间进行比较,并确定是否需要更新。

【讨论】:

    【解决方案3】:

    (假设您在 Powershell 中执行此操作,但这些技术适用于任何语言。)

    我建议先检查文件大小。

    先做这个,很快!

    if ((gci $file1).Length -ne (gci $file2).Length)
    {
        Write-Host "Files are different!"
    }
    else
    {
        # Same size, so compare contents...
    }
    

    最后,您可以进行全面比较。如果您使用 PowerShell,请查看 Compare-Object(别名 diff)。例如,

    if (diff (gc $file1) (gc $file2))
    {
        Write-Host "Files are different!"
    }
    

    进行缓冲的逐字节比较可能会更快,如下所示: http://keestalkstech.blogspot.com/2010/11/comparing-two-files-in-powershell.html

    替代方案:

    MD5 比较实际上可能比逐字节比较慢。您不仅需要读入文件,而且还必须执行计算以获取哈希。您至少可以通过缓存旧文件的哈希进行优化——节省一半的 I/O。

    由于您要导出数据库表,因此大多数数据库都会在末尾添加行。您必须确保这是您的情况,并且您只是添加而不是更新。如果是这样,您可以只比较文件中的最后一行;例如最后的 4K 或您的行大小有多大。

    【讨论】:

      猜你喜欢
      • 2017-11-10
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多