【问题标题】:Using Perl to compare 2 large files使用 Perl 比较两个大文件
【发布时间】:2018-08-17 04:17:50
【问题描述】:

我正在使用在批处理文件中调用的 Perl 比较 2 个大型 CSV 文件。 我将结果放在第三个文件中。

目前该文件包含其他信息,如标题和其他行,如下所示:

--- file1.txt   Wed Mar  7 14:57:10 2018
+++ file2.txt   Wed Mar  7 13:56:51 2018
@@ -85217,4 +85217,8 @@

结果文件如何只包含差异? 谢谢。

这是我的 perl:

#!/usr/bin/env perl
use strict; use warnings;
use Text::Diff;
my $diffs = diff 'file1.txt' => 'file2.txt';
print $diffs;

这是我的批处理文件:

perl diffperl.pl > newperl.csv

【问题讨论】:

  • 顺便说一下,Beyond Compare Pro(不是免费的,但免费试用版)是一个很棒的比较工具,它特别具有出色的 CSV 比较模式。

标签: windows perl cmd compare diff


【解决方案1】:

统一格式,

  • 前两行表示正在比较的文件。
  • 以“@”开头的行表示文件中差异的位置。
  • 以“-”开头的行表示仅在第一个文件中的行。
  • 以“+”开头的行表示仅在第二个文件中的行。
  • 以空格开头的行表示两个文件中都有一行。
  • 输出可能包含“\ No newline at end of file”行。
  • 差异中的每一行都将以换行符结尾,即使输入的行不是。

解决方案:

$diffs =~ s/^(?:[^\n]*+\n){2}//;
$diffs =~ s/^[\@ \\][^\n]*+\n//mg;

请注意,添加CONTEXT => 0 将减少要删除的行数。


也就是说,如果您想要自己的输出格式,那么使用 Text::Diff 并没有多大意义。不妨直接使用Algorithm::Diff

use Algorithm::Diff qw( traverse_sequences );

my $qfn1 = 'file1.txt';
my $qfn2 = 'file2.txt';

my @file1 = do { open(my $fh, '<', $qfn1) or die("Can't open \"$qfn1\": $!\n"); <$fh> };
my @file2 = do { open(my $fh, '<', $qfn2) or die("Can't open \"$qfn2\": $!\n"); <$fh> };

if (@lines1) { chomp($lines1[-1]); $lines1[-1] .= "\n"; }
if (@lines2) { chomp($lines2[-1]); $lines2[-1] .= "\n"; }

traverse_sequences(\@lines1, \@lines2, {
   DISCARD_A => sub { print("-", $lines1[$_[0]]); },
   DISCARD_B => sub { print("+", $lines2[$_[1]]); },
});

【讨论】:

    【解决方案2】:

    您应该查看the documentation for Text::Diff 中的STYLE 选项。其中一种内置样式可能更符合您的喜好。但如果不是这种情况,您可以编写自己的格式化包。在我看来,您只需要提供一个返回空字符串的hunk_header() 方法(因为它是您不喜欢的大块标题行)。

    【讨论】:

    • 谢谢大家。 ikegami 的解决方案有效! #!/usr/bin/env perl 使用严格;使用警告;使用文本::差异;我的 $diffs = diff 'file1.txt' => 'file2.txt'; $diffs =~ s/^(?:[^\n]*+\n){2}//; $diffs =~ s/^(?:[\@ ][^\n]*+)?+\n//mg;打印 $diffs;是否可以在 newperl.csv 中包含 file1.txt 的标头?谢谢。
    • @faujong:在评论中发布代码确实不是很有用 :-) 如果您还有其他问题,请发新帖。
    猜你喜欢
    • 2012-03-18
    • 2014-06-14
    • 2014-03-30
    • 1970-01-01
    • 2017-07-25
    • 2014-02-16
    • 2015-07-08
    • 2014-05-31
    • 1970-01-01
    相关资源
    最近更新 更多