【问题标题】:How can I check if contents of one file exist in another in Perl?如何在 Perl 中检查一个文件的内容是否存在于另一个文件中?
【发布时间】:2011-02-12 15:00:42
【问题描述】:

要求:-

File1 的内容类似于 -

ABCD00000001,\some\some1\ABCD00000001,Y,,5(表示单元内共有5个文件)

File2 的内容为ABCD00000001

所以我需要做的是检查来自 File2 的 ABCD00000001 是否存在于 File1 中 - 如果是{

将输出打印到 Output.txt 直到找到另一个 ',Y,,X'}

else{ 不继续检查}

有人吗?非常感谢任何帮助。

您好 Arkadiy 输出应该是:- 文件 2 -ABCD00000001 中的文件 1 和从 Y 到 Y 的任何文件名。 例如:- 文件 1 结构将是:-

ABCD00000001,\some\some1\ABCD00000001,Y,,5
ABCD00000001,\some\some1\ABCD00000002
ABCD00000001,\some\some1\ABCD00000003
ABCD00000001,\some\some1\ABCD00000004
ABCD00000001,\some\some1\ABCD00000005
ABCD00000001,\some\some1\ABCD00000006,Y,,2
so out put should contain all line between 
ABCD00000001,\some\some1\ABCD00000001,Y,,5 and

ABCD00000001,\some\some1\ABCD00000006,Y,,2

#!/usr/bin/perl -w
use strict;


my $optFile = "C:\\Documents and Settings\\rgolwalkar\\Desktop\\perl_scripts\\SampleOPT1.opt";
my $tifFile = "C:\\Documents and Settings\\rgolwalkar\\Desktop\\perl_scripts\\tif_to_stitch.txt";
print "Reading OPT file now\n";
open (OPT, $optFile);
my @opt_in_array = <OPT>;
close(OPT);

foreach(@opt_in_array){
    print();
}

print "\nReading TIF file now\n";

open (TIF, $tifFile);
my @tif_in_array = <TIF>;
close(TIF);

foreach(@tif_in_array){
    print();
}

所以它所做的就是读取 2 个文件“仅供参考 -> 我是编程新手”

【问题讨论】:

  • Output.txt 是第三个文件还是 File1?
  • 嗨,Trey,这将是一个用于输出目的的新文件,谢谢
  • 您是在 File1 中寻找 File2 的全部内容吗?或者文件 2 中 File1 中的任何“合理”(?)子字符串?
  • 不是试图减少我的工作的家庭作业
  • -1 如果您要求人们花时间帮助您,至少要花一些时间来明确您的问题。到目前为止你做了什么?你为什么把它标记为 Perl?你知道 Perl 吗?什么操作系统?你有GREP吗?你知道阿克吗?这很容易解决,但你也需要帮助自己......

标签: perl file compare


【解决方案1】:

尝试将您的问题分解为离散的步骤。看来你需要这样做(虽然你的问题不是很清楚):

  • 打开文件1进行阅读
  • 打开文件2进行阅读
  • 逐行读取file1:
    • 对于file1中的每一行,检查file2中是否有特定内容

你在哪个部分有困难?到目前为止你有什么代码?一旦你在内存中有一行,你可以使用正则表达式将它与另一个字符串进行比较,或者更简单的比较形式。

【讨论】:

  • hmm 只是想要帮助:- 如何从 Y 打印到 Y 我已将所需的输出粘贴到主评论中。
  • @golwalkar => 仅仅发布所需的输出是不够的。发布一些您认为应该工作的示例代码。 Ether 的答案是“教人钓鱼”类型的答案。
  • 好的,在主代码中做同样的事情。忏悔:- 只是能够读取文件而已。
  • 我已经添加了代码,是的,Esther 除了读取两个文件之外它什么都不做:(
【解决方案2】:

好的,我会咬(部分)...

第一个通用 cmets。使用 strict 和 -w 很好,但您没有检查打开的结果或明确说明您想要的读/写模式。

您的 OPT 文件的内容有点像 CSV,第二个字段看起来像 Windows 路径,对吗?如果是这样,请使用 CPAN 中的相应库来解析 CSV 并验证您的文件名。否则会导致痛苦和痛苦……

正如 Ether 之前所说,您需要读取文件 OPT 然后匹配您想要的字段。如果第一个文件是 CSV,首先您需要在不破坏文件名的情况下对其进行解析。

这是一个小型的 sn-p,它将解析您的 OPT 文件。此时,它所做的只是打印字段,但您可以添加逻辑以轻松匹配其他文件。只需将 (slurp) 整个第二个文件读入一个字符串,并与您选择的第一个字段匹配:

#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;

my $csv = Text::CSV->new();
my @opt_fields;


while (<DATA>) {
    if ($csv->parse($_)) {
        push @opt_fields, [ $csv->fields() ];
    } else {
        my $err = $csv->error_input;
        print "Failed to parse line: $err";
    }
}


foreach my $ref (@opt_fields) {
#   foreach my $field (@$ref) { print "$field\n"; }
    print "The anon array: @$ref\n";
    print "Use to match?: $ref->[0]\n";
    print "File name?: $ref->[1]\n";
}

__DATA__
ABCD00000001,\some\some1\ABCD00000001,Y,,5
ABCD00000001,\some\some1\ABCD00000002
ABCD00000001,\some\some1\ABCD00000003
ABCD00000001,\some\some1\ABCD00000004
ABCD00000001,\some\some1\ABCD00000005
ABCD00000001,\some\some1\ABCD00000006,Y,,2

【讨论】:

  • @Drewk - 非常感谢你帮我解决这个问题 - 我现在正在尝试 - 完成后将粘贴代码和结果
猜你喜欢
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 2014-01-20
  • 2018-08-30
  • 2013-02-14
  • 2013-02-10
相关资源
最近更新 更多