Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较两个巨大的CSV文件进行更改的最快方法是什么?_C#_.net_Powershell_Architecture - Fatal编程技术网

C# 比较两个巨大的CSV文件进行更改的最快方法是什么?

C# 比较两个巨大的CSV文件进行更改的最快方法是什么?,c#,.net,powershell,architecture,C#,.net,Powershell,Architecture,我认为这是一个架构和/或设计相关的问题: 我的场景是: " 我将大量数据从Db导出到CSV 我经常这样做 我想检查上次导出的CSV数据是否与 “以前导出的数据的内容” 如何实现这一点(无需逐行循环和比较) 注释: 我的导出器是一个.Net控制台应用程序 我的数据库是MS-SQL(如果您需要知道) My exporter作为计划任务定期运行-在PowerShell脚本中 听起来您只想为每个CSV文件生成一个校验和进行比较。 您可以让数据库跟踪上次修改的时间。只需将触发器添加到该表中,无论何

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

我的场景是

"

  • 我将大量数据从Db导出到CSV
  • 我经常这样做
  • 我想检查上次导出的CSV数据是否与 “以前导出的数据的内容”
如何实现这一点(无需逐行循环和比较)

注释

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

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

  • My exporter作为计划任务定期运行-在PowerShell脚本中


听起来您只想为每个CSV文件生成一个校验和进行比较。


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

(这假设您是在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!"
}
进行缓冲字节到字节的比较可能更快,如下所示:

备选方案:

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


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

我正在考虑使用校验和作为一种选择…您能否将这一点作为问题的一部分,无需评论:)好吧,我不想通过指出来影响意见。。。也许有比校验和更好的选择,我不想阻止这些想法:)我同意这个想法-甚至可能在每次导出之前计算校验和-将校验和保存在数据库的“导出历史”表中,这样你就有了每次导出的永久记录。我喜欢导出历史的想法
if (diff (gc $file1) (gc $file2))
{
    Write-Host "Files are different!"
}