4

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

我的场景是

"

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

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

备注

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

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

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

4

3 回答 3

6

听起来您只想生成每个 CSV 文件的校验和以进行比较。
计算文件的 MD5 校验和

using (var md5 = MD5.Create())
{
    using (var stream = File.OpenRead(filename))
    {
        return md5.ComputeHash(stream);
    }
}
于 2012-11-08T14:09:46.750 回答
1

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

于 2012-11-08T14:38:35.567 回答
0

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

我建议先检查文件大小。

先做这个,很快!

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

最后,您可以进行全面比较。如果您使用的是 PowerShell,请查看Compare-Object(alias 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 或者你的行大小有多大。

于 2012-11-09T00:53:56.360 回答