Сравните два файла и запишите соответствующие данные из первого файла, используя perl - PullRequest
0 голосов
/ 25 октября 2018

Первый файл

Имя: Фамилия: Местоположение: Страна: ID

Имя1: Фамилия1: Местоположение1: Страна1: ID1

Имя2: Фамилия2: Местоположение2: Страна2: ID2

Имя_3: ​​Фамилия3: Местоположение3: Страна3: ID3

Имя_4: Фамилия4: Местоположение4: Страна4: ID4

Второй файл

Имя: Фамилия: Расположение:Страна: Old_ID

FirstName2: LastName2: Location2: Страна2: Old_ID2

FirstName4: LastName4: Location4: Country4: Old_ID4

Необходимо сравнить первый и второй файл и напечатать соответствующие строкис данными из первого файла, которые имеют новые идентификаторы.

Ниже скрипт извлекает мне Old_ID из второго файла, а не новые из первого файла

use warnings;
use strict;

my $details  = 'file2.txt';
my $old_details = 'file1.txt';

my %names;

open my $data, '<', $details or die $!;
while (<$data>)
 {
   my ($name, @ids) = split;
   push @{ $names{$_} }, $name for @ids;
 }

open my $old_data, '<', $old_details or die $!;
while (<$old_data>) 
 {
  chomp;
 print @{ $names{$_} // [$_] }, "\n";
 }

Вывод:

Имя: Фамилия: Местоположение: Страна: Old_ID

Имя_2: Фамилия2: Местоположение2: Страна2: Old_ID2

Имя_4: Фамилия4: Местоположение 4: Страна4: Old_ID4

Ожидаемый результат:

Имя: Фамилия: Местоположение: Страна: ID

Имя_2: Фамилия2: Местоположение2: Страна2: ID2

Имя_4: Фамилия4: Местоположение4: Страна4: ID4

1 Ответ

0 голосов
/ 25 октября 2018

Просто попробуйте так:

use strict; # Use strict Pragma
use warnings;

my ($file1, $filecnt1, $file2, $filecnt2) = ""; #Declaring variables 

$file1 = "a1.txt"; $file2 = "b1.txt";  #Sample files

readFileinString($file1, \$filecnt1); # Reading first file
readFileinString($file2, \$filecnt2); # Reading second file

$filecnt2=~s/\:Old\_ID/\:ID/g;  # Replacing that difference content

my @firstfle = split "\n", $filecnt1;  # Move content to array variable to compare
my @secndfle = split "\n", $filecnt2;

my %firstfle = map { $_ => 1 } @firstfle; #Mapping the array into hash variable
my @scdcmp = grep { $firstfle{$_} } @secndfle;

print join "\n", @scdcmp;


#---------------> File reading
sub readFileinString
#--------------->
{
    my $File = shift;
    my $string = shift;
    open(FILE1, "<$File") or die "\nFailed Reading File: [$File]\n\tReason: $!";
    read(FILE1, $$string, -s $File, 0);
    close(FILE1);
}

#---------------> File Writing
sub writeFileinString
#--------------->
{
    my $File = shift;
    my $string = shift;
    my @cDir = split(/\\/, $File);
    my $tmp = "";
    for(my $i = 0; $i < $#cDir; $i++)
    {
        $tmp = $tmp . "$cDir[$i]\\";
        mkdir "$tmp";
    }
    if(-f $File){
        unlink($File);
    }
    open(FILE, ">$File") or die "\n\nFailed File Open for Writing: [$File]\n\nReason: $!\n";
    print FILE $$string;
    close(FILE);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...