IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Traitement de fichiers, erreur de concaténation


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 43
    Points : 26
    Points
    26
    Par défaut Traitement de fichiers, erreur de concaténation
    Bonjour,

    Lors du traitement de fichiers, je concaténe des données trouvées dans chaque ligne me permettant de former une clé de hash.

    Voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
        22                 while(my $logs = <$logs_content>){
         23                         my @data = split m!@!,$logs;
         24                         my $date = &date_split($data[0]);
         25                
         26                     
         27                         if($data[3]=~ /\|/){
         28                                 my @catId = split(/\|/,$data[3]);
         29                                 #incrementation pour chaque ligne/lead
         30                                 $hash{$date."#".$data[7]."#".$catId[1]}++;
         31             
         32                         }
         33                         else { $hash{$date."#".$data[7]."#".$data[3]}++;
         34                           
         35                         }
         36                 
         37                 }
    J'ai l'erreur suivante au milieu de mon traitement quand je lance le script:
    Use of uninitialized value in concatenation (.) or string at ./Parser_LeadsLogs.pl line 42, <$logs_content> line 364317.

    J'ai intégré un compteur pour voir à quoi correspond la ligne 364317 et la ligne n'existe pas, elle correspond à la fin de mon fichier.

    Quelqu'un connait le probléme?

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Visiblement tes numéros de ligne (dans le code que tu as collé) sont faux (ou tu as fait quelque chose de bizarre, par exemple utiliser la consigne LINE), j'aimerais bien savoir d'où tu les sorts. Du coup je ne peux que supposer où se trouve l'erreur.
    A mon avis il y a une ligne vide à la fin de ton fichier, et comme tu ne testes jamais pour ça, tu te retrouve à utiliser des éléments vides de ton tableau @data.
    Il te suffit de rajouter un petit test qui vérifie combien de colonne tu avais sur ta ligne, comme ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    while(my $logs = <$logs_content>){
      my @data = split m!@!,$logs;
      my $date = &date_split($data[0]);
     
      # dans une bonne ligne j'ai 8 colonnes
      next if @data < 8;
      if($data[3]=~ /\|/){
        my @catId = split(/\|/,$data[3]);
        #incrementation pour chaque ligne/lead
        $hash{$date."#".$data[7]."#".$catId[1]}++;
     
      } else { 
        $hash{$date."#".$data[7]."#".$data[3]}++;
      }
    }
    --
    Jedaï

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    En effet, voici tout le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
     
         22                 while(my $logs = <$logs_content>){
         23                         my @data = split m!@!,$logs;
         24                         my $date = &date_split($data[0]);
         25                         #print $cpt++." -> ";
         26                         #print $data[3]."\n";
         27
         28                         if($data[3]=~ /\|/){
         29                                 my @catId = split(/\|/,$data[3]);
         30                                 #incrementation pour chaque ligne/lead
         31                                 $hash{$date."#".$data[7]."#".$catId[1]}++;
         32                                 #print $date."#".$data[7]."#".$catId[1]."\n";
         33                         }
         34                         else { $hash{$date."#".$data[7]."#".$data[3]}++;
         35                                 #print $date."#".$data[7]."#".$data[3]."\n";
         36                         }
         37                         #print $date."#".$data[7]."#".$data[3]."\n";
         38                 }
         39                 foreach my $cle (keys %hash){
         40                         my @fields = split (/#/,$cle);
         41                         
         42                         #on regarde si les donnees existent deja en base
         43                         
         44                         my $sel = $dbconnect->prepare("SELECT * FROM salestoolsLeads WHERE hitDate='$fields[0]' AND country='$country' AND comid='$        fields[1]' AND catId='$fields[2]' ");                                                                                                                   45                                                                                                                46                         $sel->execute() || die "pb de selection: $DBI::errstr";                                                                         47                                 if ($sel->rows() == 0){                                                                                                 48                                         #insertion en base                                                                                              49                                         $dbconnect->do("INSERT INTO salestoolsLeads SET hitDate='$fields[0]', country='$country',comid='$fields[1]'        ,catId='$fields[2]', nbLeads='$hash{$cle}' ");                                                                                                          50                                 }                                                                                                                       51                 }
    L'erreur se situe ligne 44,
    "Use of uninitialized value in concatenation (.) or string at ./Parser_LeadsLogs.pl line 44, <$logs_content> line 364317."

    J'ai fais le test sur le nb de colonnes sur une ligne sans succès.

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    L'espace entre le $ et fields[1] est une erreur de copier-coller ? $country est bien défini ?
    Même si la ligne que je t'avais donné n'as pas réglé le problème tu devrais quand même la mettre, c'est dangereux de l'omettre...

    Tu devrais utiliser des placeholders dans tes requêtes plutôt que d'interpoler directement tes variables.

    --
    Jedaï

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    L'espace entre le $ et fields[1] est une erreur de copier-coller et $country est bien définie...

    J'ai essayé d'afficher un print "SELECT * FROM salestoolsLeads WHERE hitDate='$fields[0]' AND country='$country' AND comid='$fields[1]' AND catId='$fields[2]' "

    Les champs sont bien remplis...

Discussions similaires

  1. traitement de fichier
    Par loic_86 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/11/2005, 17h56
  2. Réponses: 1
    Dernier message: 24/07/2005, 22h25
  3. TRaitement de fichier avec PERL
    Par Dr_GonZO dans le forum Langage
    Réponses: 4
    Dernier message: 22/07/2005, 12h38
  4. traitement de fichier XML dans une Tache planifiée
    Par marivi dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 21/06/2005, 10h40
  5. [Fichiers] Erreur incompréhensible
    Par Clorish dans le forum Langage
    Réponses: 5
    Dernier message: 14/12/2004, 17h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo