Windows 使用Perl比较2个大文件

Windows 使用Perl比较2个大文件,windows,perl,cmd,compare,diff,Windows,Perl,Cmd,Compare,Diff,我正在使用批处理文件中调用的Perl比较两个大型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

我正在使用批处理文件中调用的Perl比较两个大型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

您应该查看中的
样式
选项。可能其中一种内置样式更符合您的喜好。但如果不是这样,您可以编写自己的格式包。在我看来,您只需要提供一个返回空字符串的
hunk_header()
方法(因为您不喜欢的是hunk header行)。

采用统一格式

  • 前两行表示要比较的文件
  • 以“
    @
    ”开头的行表示文件中差异的位置
  • 以“
    -
    ”开头的行表示仅在第一个文件中的行
  • 以“
    +
    ”开头的行表示仅在第二个文件中的行
  • 以空格开头的行表示两个文件中的行
  • 输出可能包含行“
    \n文件末尾无换行符”
  • 差分中的每一行都将换行终止,即使输入的行不是
解决方案:

$diffs =~ s/^(?:[^\n]*+\n){2}//;
$diffs =~ s/^[\@ \\][^\n]*+\n//mg;
请注意,添加
CONTEXT=>0将减少要删除的行数


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

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]]); },
});
使用算法::Diff qw(遍历序列);
my$qfn1='file1.txt';
my$qfn2='file2.txt';

my@file1=do{open(my$fh,'顺便说一句,Beyond Compare Pro(不是免费的,但免费试用)是一个很好的比较工具,它特别有一个很好的CSV比较模式。谢谢大家。ikegami的解决方案很管用!!/usr/bin/env perl使用strict;使用警告;使用Text::Diff;my$Diff=Diff'file1.txt'=>'file2.txt'$Diff=~s/^:([^\n]*+\n) {2}/;$diffs=~s/^(?:[\@][^\n]*+)?+\n//mg;print$diffs;是否可以将file1.txt中的头包含在newperl.csv中?谢谢。@faujong:在注释中发布代码真的不是很有用:-)如果您还有其他问题,请发表新的帖子。