Как я могу проверить, существует ли содержимое одного файла в другом в Perl? - PullRequest
0 голосов
/ 27 апреля 2010

Требование: -

Файл1 имеет такое содержимое, как -

ABCD00000001,\some\some1\ABCD00000001,Y,,5 (это означает, что в блоке всего 5 файлов)

Файл2 имеет содержимое как ABCD00000001

Итак, что мне нужно сделать, это проверить, существует ли ABCD00000001 из File2 в File1 - если да {

печатать вывод в Output.txt, пока он не найдет другой ', Y ,, X'}

else {Нет, продолжайте проверять}

Кто-нибудь? Любая помощь с благодарностью.

Привет Аркадий Вывод должен быть: - любое имя файла из файла 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 файла "FYI -> Я новичок в программировании"

Ответы [ 2 ]

1 голос
/ 27 апреля 2010

Попробуйте разбить вашу проблему на отдельные шаги. Похоже, вам нужно это сделать (хотя ваш вопрос не очень понятен):

  • открыть файл1 для чтения
  • открыть файл2 для чтения
  • чтение файла1, строка за строкой:
    • для каждой строки в файле1, проверьте, есть ли конкретный контент в файле2

С какой частью вы испытываете трудности? Какой код у тебя так далеко? Если в памяти есть строка, вы можете сравнить ее с другой строкой, используя регулярное выражение или, возможно, более простую форму сравнения.

0 голосов
/ 27 апреля 2010

ОК, я укушу (частично) ...

Первые общие комментарии. Используйте строгий и -w хорошо, но вы не проверяете результаты открытия или явно указываете желаемый режим чтения / записи.

Содержимое вашего файла OPT вроде как CSV, а второе поле выглядит как путь Windows, верно? Если это так, используйте соответствующую библиотеку из CPAN для анализа CSV и проверки имен файлов. В противном случае страдание и боль могут быть результатом ...

Как было сказано ранее в Ether, вам нужно прочитать файл OPT, а затем найти нужное поле. Если первый файл CSV, сначала вам нужно проанализировать его, не уничтожая имена файлов.

Вот небольшой фрагмент, который проанализирует ваш файл 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...