我认为这是一个架构和/或设计相关的问题:
我的场景是:
"
- 我将大量数据从 Db 导出到 CSV。
- 我经常这样做。
- 我想检查最后导出的 CSV 数据是否与之前导出的数据的内容不同”
我怎样才能做到这一点(无需逐行循环和比较)?
备注:
我的导出器是一个 .Net 控制台应用程序。
我的数据库是 MS-SQL(如果你需要知道的话)
我的导出器在 PowerShell 脚本中作为计划任务定期运行
我认为这是一个架构和/或设计相关的问题:
我的场景是:
"
我怎样才能做到这一点(无需逐行循环和比较)?
备注:
我的导出器是一个 .Net 控制台应用程序。
我的数据库是 MS-SQL(如果你需要知道的话)
我的导出器在 PowerShell 脚本中作为计划任务定期运行
听起来您只想生成每个 CSV 文件的校验和以进行比较。
计算文件的 MD5 校验和
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
return md5.ComputeHash(stream);
}
}
您可以让数据库跟踪上次修改的时间。只需向该表添加一个触发器,每当添加/删除/更新任何项目时,您都可以将特定值设置为当前时间。然后,您首先不需要比较大文件;您的导出作业可以简单地查询上次修改时间,将其与文件系统上文件的上次修改时间进行比较,并确定是否需要更新它。
(这假设您在 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 或者你的行大小有多大。