windows - 在 Windows 中,如何比较两个文件并只返回第二个文件中丢失的记录,这些记录最初存在于第一个文件中?

标签 windows perl sorting diff batch-file

我们会定期从我们无法控制的外部来源接收 CSV 文件。这些文件是完整的当前记录集;但是,自上次以来删除的任何记录都不存在。我们想比较这两个文件并创建一个单独的已删除记录文件,以便我们可以对它们进行一些额外的处理。在另一个领域的应用程序中,我们有一个开箱即用的商业排序包(CoSort);但是,我们在这里无法访问它。不过,数量并没有那么大,而且标准或免费工具似乎可以很容易地处理这些问题。理想情况下,这将采用 Windows 批处理文件的形式,但 Perl 或 awk 解决方案也可以。输入文件示例:

上一个文件:

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 对两个文件进行排序,减去标题记录,以便更容易进行某种类型的差异处理:

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 命令——一个仅限于检查关键字段而不是整个记录的命令。不过,我似乎无法获得正确的语法。想法?记录数不应超过 50k 条记录。

注意:如果这是 SQL 并且数据位于表中,我们可以使用 EXCEPT operator但在这种情况下将数据移动到数据库不是一种选择。

最佳答案

关于windows - 在 Windows 中,如何比较两个文件并只返回第二个文件中丢失的记录,这些记录最初存在于第一个文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/827358/

相关文章:

perl 将单个变量封装在双引号中

perl - 我如何将 Unix/Sed/Perl 的音译 (tr) 应用于特定列?

arrays - 如何对字符串数组进行排序

windows - ASM x64 中 40h REX 操作码的用途是什么?

Windows 案例问题上的 PHP realpath

c++ - std::map::find(char*) 在 Debug模式下无法在 64 位机器上运行

java - 使用 Apache Commons CompareToBuilder 降序排序

windows - Windows错误报告在哪里创建转储文件

perl - 如何同时对多个文件使用 grep 命令?

python - 有没有一种方法可以对坐标进行排序,以便在绘制数据时它会形成一个封闭的形状?