une erreur l'array , hash-tableau

une erreur l'array , hash-tableau - Perl - Programmation

Marsh Posté le 14-12-2015 à 19:38:53    

Salut  
j'ai un souci avec ce code il fonctionnait avec d'autres fichiers d'entree j'ai change les fichiers d'entree maintenant il me retourne l'erreur suivante,
j'ai eu a modifier la ligne 63 de la sorte
 

Code :
  1. print $wh "$colums1{$i} $row->[$i]$data2{$colums1{$i}}\n";


 
 ca n'a pas marche
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use Text::CSV;
  6. use Data::Dumper;
  7.  
  8.  
  9. my $infile1 = "DATA2.csv";
  10. my $infile2 = "default.csv";
  11.  
  12.  
  13. my $csv = Text::CSV->new(
  14.  { sep_char => ',', allow_whitespace => 1, binary => 1 }
  15. );
  16.  
  17.  
  18. # open input files
  19. open my $csv_1, '<', $infile1       or die "open($infile1,r) failed: $!";
  20. open my $csv_2, '<', $infile2       or die "open($infile2,r) failed: $!";
  21.  
  22.  
  23.  
  24.  
  25. <$csv_2>;                                    
  26. my @columns2 = @{ $csv->getline($csv_2) };  
  27. my @values   = @{ $csv->getline($csv_2) };  
  28. my %data2;
  29. for my $i ( 0 .. $#columns2 ) {            
  30.  
  31.    $data2{$columns2[$i]} = defined $values[$i] ? $values[$i] : '';
  32. }
  33.  
  34.  
  35. warn Data::Dumper->Dump( [ \%data2 ], [ '*data2' ] )    if $ENV{DEBUG};
  36.  
  37.  
  38. my @colums1;
  39. while ( my $row = $csv->getline( $csv_1 ) ) {
  40.    next    if 0 == $#{$row};              
  41.    next    if 6 == $#{$row};              
  42.  
  43.    my ( $significator, $filename ) = split m{\s+}, $row->[0];
  44.  
  45.  
  46.    if ( $significator eq 'default' ) {
  47.        @colums1 = @$row;
  48.        shift @colums1;
  49.  
  50.        warn Data::Dumper->Dump( [ \@colums1 ], [ '*columns1' ] )    if $ENV{DEBUG};
  51.    }
  52.  
  53.    elsif ( $significator eq 'false' ) {
  54.        warn Data::Dumper->Dump( [ $row ], [ '*row' ] )    if $ENV{DEBUG};
  55.  
  56.        open (my $wh, ">", "$filename.csv" ) or die "Can't open per-line file $filename: $!\n";
  57.  
  58. print $wh "$filename:\n";
  59.  
  60.        shift @$row;
  61.        for my $i ( 0 .. $#{$row}-1 ) {
  62.  
  63.            print $wh "$colums1[$i] $row->[$i]$data2{$colums1[$i]}\n";
  64.  
  65.        }
  66.  
  67.        close $wh or die "close($filename,w) failed: $!";
  68.    }
  69.  
  70. }


Code :
  1. .pl line 63, <$csv_1> line 127.
  2. Use of uninitialized value within @colums1 in hash element at new.pl line 63, <$
  3. csv_1> line 127.
  4. Use of uninitialized value within @colums1 in concatenation (.) or string at new
  5. .pl line 63, <$csv_1> line 127.
  6. Use of uninitialized value within @colums1 in hash element at new.pl line 63, <$
  7. csv_1> line 127.
  8. Use of uninitialized value within @colums1 in concatenation (.) or string at new
  9. .pl line 63, <$csv_1> line 127.
  10. Use of uninitialized value within @colums1 in hash element at new.pl line 63, <$
  11. csv_1> line 127.
  12. Use of uninitialized value within @colums1 in concatenation (.) or string at new
  13. .pl line 63, <$csv_1> line 127.
  14. Use of uninitialized value within @colums1 in hash element at new.pl line 63, <$
  15. csv_1> line 127.
  16. Use of uninitialized value within @colums1 in concatenation (.) or string at new
  17. .pl line 63, <$csv_1> line 127.
  18. Use of uninitialized value within @colums1 in hash element at new.pl line 63, <$
  19. csv_1> line 127.
  20. Use of uninitialized value within @colums1 in concatenation (.) or string at new
  21. .pl line 63, <$csv_1> line 127.
  22. Use of uninitialized value within @colums1 in hash element at new.pl line 63, <$
  23. csv_1> line 127.
  24. C:\Users\Desktop\CAV>

Reply

Marsh Posté le 14-12-2015 à 19:38:53   

Reply

Marsh Posté le 15-12-2015 à 14:35:23    

Sans 2 ou 3 lignes du CSV pour se faire une idée, difficile de répondre.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-12-2015 à 15:22:00    

Salut Gilou tu les as deja, peut etre ce qui manque est le parser du default je vais essaye de te l'envoye

Reply

Marsh Posté le 15-12-2015 à 16:17:35    

Bon ben c'est simple: tu as des champs de la ligne default de ton CSV qui n'apparaissent pas dans ton default.csv.
Donc pour un de ces champs, de valeur $colums1[$i] il n'y a pas de clé avec cette valeur dans %data2 d'ou le message.
 
Pour savoir lesquels, modifier avec:
for my $i ( 0 .. $#{$row}-1 ) {
      # print $wh "$colums1[$i] $row->[$i]$data2{$colums1[$i]}\n";
      unless ($data2{$colums1[$i]}) { print "pas défini pour i = $i\n et $colums1[$i]"};
    }
 
A+,


Message édité par gilou le 15-12-2015 à 16:19:00

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-12-2015 à 20:46:19    

oui je n'avais pas faite cette remarque.  
c'est bizard parceque j'ai un peu modifier le script pour parser et il me revois ce resultat.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed