使用Perl比较2个大文件

时间:2018-03-08 17:49:06

标签: windows perl cmd compare diff

我正在使用Perl在批处理文件中调用2个大型CSV文件。 我把结果放在第3档。

目前该文件包含其他信息,如标题,以及其他类似的行:

--- 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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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]]); },
});