Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re^5: How to assign an array to a value in hash?

by vukotid (Initiate)
on Mar 09, 2015 at 12:31 UTC ( [id://1119313]=note: print w/replies, xml ) Need Help??


in reply to Re^4: How to assign an array to a value in hash?
in thread Re: How to assign an array to a value in hash?

Hi Thanks very much for the hot fix to my problem.

Actually I need to compare two different versions of the same properties file and than should bring the changes into .csv file.

Now the question is how I should compare and get the changes of those two hashes of arrays and write it into .csv file.

Please kindly suggest me the approach.

Thanks

Dhananjaya V
  • Comment on Re^5: How to assign an array to a value in hash?

Replies are listed 'Best First'.
Re^6: How to assign an array to a value in hash?
by AppleFritter (Vicar) on Mar 09, 2015 at 21:23 UTC

    Sure. Here's a script that parses two files and compares the values for each key using List::Compare:

    #!/usr/bin/perl use strict; use warnings; use feature qw/say/; use List::Compare; use List::AllUtils qw/uniq/; sub parse_file($) { my ($filename) = @_; open my $filehandle, "<", $filename or die "Could not open $filename: $!"; my %parsed = (); while(<$filehandle>) { chomp; my ($key, $values) = split "=", $_, 2; my @values = split ",", $values; $parsed{$key} = \@values; } return \%parsed; } my %parsed_file1 = %{ parse_file "File1" }; my %parsed_file2 = %{ parse_file "File2" }; foreach my $key (sort { $a cmp $b } uniq (keys %parsed_file1, keys %pa +rsed_file2)) { my $listcompare = List::Compare->new($parsed_file1{$key} // [] +, $parsed_file2{$key} // []); my @added_values = $listcompare->get_Ronly; my @removed_values = $listcompare->get_Lonly; my @retained_values = $listcompare->get_intersection; say $key; say "\tValues added : ", join ", ", @added_values; say "\tValues removed : ", join ", ", @removed_values; say "\tValues retained: ", join ", ", @retained_values; }

    Here's my File1:

    B23168=AOL,ABC permitted_mac_attempts=1,DEF B23167=Carphone Warehouse TalkTalk,23 B23163=Orange,Red,Blue,Green,White,Black B23970=O2 APPLE=FRITTER

    And my File2:

    B23168=AOL,ABC,DEF,EFG permitted_mac_attempts=1,DEF,34,4 B23167=Carphone Warehouse TalkTalk,23,5,6 B23163=Orange,Red,Blue,Green,Yellow B23970=O2,56 PONY=EARTH

    Using these, the script outputs:

    $ perl 1119397.pl APPLE Values added : Values removed : FRITTER Values retained: B23163 Values added : Yellow Values removed : Black, White Values retained: Blue, Green, Orange, Red B23167 Values added : 5, 6 Values removed : Values retained: 23, Carphone Warehouse TalkTalk B23168 Values added : DEF, EFG Values removed : Values retained: ABC, AOL B23970 Values added : 56 Values removed : Values retained: O2 PONY Values added : EARTH Values removed : Values retained: permitted_mac_attempts Values added : 34, 4 Values removed : Values retained: 1, DEF $

    Writing to a CSV file is left as an exercise for the reader (I don't know how you want your CSV file to look anyway), but I'd strongly suggest using Tux's excellent Text::CSV module.

      Hi I am really grateful to you my dear AppleFritter.

      Thanks very much for your knowledge sharing

      This helped me a lot.

      Thanks

      Dhananjaya V
        *tips hat* You're welcome, pardner!

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1119313]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others taking refuge in the Monastery: (6)
As of 2024-04-18 17:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found