定期接收我们无法控制的外部来源的CSV文件。这些文件是当前记录的完整集合;但是,自上次以来删除的任何记录都不存在。我们想比较这两个文件并创建一个单独的已删除记录文件,以便我们可以对它们进行一些额外的处理。在另一个领域的应用程序中,我们有一个商业分类包(CoSort),它可以实现这一功能;然而,我们在这里没有访问权限。尽管如此,这些数量并不是那么大,看起来这是标准或免费工具可能很容易处理的事情。理想情况下,这将采用Windows批处理文件的形式,但Perl或awk解决方案也可以。例如输入文件:在Windows中,如何比较两个文件并仅返回第一个文件中原来存在的第二个文件中缺少的记录?
上一个文件:
X_KEY,X_NAME,X_ATTRIBUTE
123,Name 123,ATT X
111,Name 111,ATT X
777,Name 777,ATT Y
传入的文件:
X_KEY,X_NAME,X_ATTRIBUTE
777,Name 777,ATT Y
123,Name 123,ATT CHANGED
生成的文件应至少包括:
111,Name 111
但是,如果被删除的属性记录也通过,这很好。
到目前为止,我有一个使用免费软件CMSort两个文件减去头记录进行排序的批处理文件,以使其更容易为某些类型的DIFF过程:
REM Sort Previous File, Skip Header
C:\Software\CMSort\cmsort.exe /H=1 x_previous.txt x_previous_sorted.txt
REM Sort Incoming File, Skip Header
G:\Software\CMSort\cmsort.exe /H=1 x_incoming.txt x_incoming_sorted.txt
但“比较,只有展示从第一个文件丢失的记录'位是逃避我。复杂性的一部分是许多属性可以在剩下的记录中改变,所以它不是纯粹的差异。然而,它感觉就像是一个专门的diff命令 - 它只限于检查关键字段,而不是整个记录。不过,我似乎无法得到正确的语法。想法?记录数不应超过5万条记录。
注意:如果这是SQL并且数据位于表中,我们可以使用EXCEPT operator,但在这种情况下将数据移到数据库不是一个选项。
既然你提到差异,这是值得注意的是,diffutils的是可用于Windows : http://gnuwin32.sourc eforge.net/packages/diffutils.htm – si28719e 2009-05-05 23:54:33