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 :

J'ai une itération de plus sans raison


Sujet :

Langage Perl

  1. #1
    Invité
    Invité(e)
    Par défaut J'ai une itération de plus sans raison
    Bonjour,
    Mon script permet de parser un fichier CSV afin d'extraire des données et les mettre dans un hash,
    Je suis arrivé au point ou je donne le chemin du fichier et je le parse correctement sans problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $file = '/mon_repertoire/sous_rep/fichier.csv';
    open (F, $file) || die ("Could not open $file!");
    while ($line = <F>)
    {
    #traitement
    }
    Affichage du résultat
    Jusqu'ici tout va bien, mais je n'ai pas un seul fichier, j'ai une centaine de fichier, donc je dois les parser tous un par un :
    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
     
    my @all_csv =`find /mon_repertoire/sous_rep/ -name "*.csv"`;
    if (not (@all_csv))
    {
    print("Nothing found... \n");
    }
    else
    {
    foreach my $file (@all_csv)
    {
    open (F, $file) || die ("Could not open $file!");
    while ($line = <F>)
    {
    #exactement le même traitement à la lettre
    }
    Affichage du résultat
    }
    }
    Tout semble correct, mais hélas, il prend beaucoup de temps,
    j'ai alors mis un seul fichier dans le dossier et essayer le script avec les deux façon en intoduisant une variable $i et l'affichant dans les deux cas, le deuxième cas parsait le fichier une première fois pour rien, et ne remplissait pas le hash, et c'est après que les hash sont remplis, alors que pour le premier, il fonctionne nikel,
    à titre indicatif, j'ai deux hashs, le premiers est ce dont j'ai besoin d'afficher, et le deuxième et pour éviter de traiter un ligne contenant (key & valeur) déjà traité, comme j'ai dit pour le deuxième script, il ne les rempli qu’après tout une itération sur le fichier (contenant plus de 5000 lignes) pour rien,

    Merci de m'aider.
    Dernière modification par djibril ; 28/12/2011 à 10h14.

  2. #2
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Ça n'a pas de lien direct avec ton problème, mais si ta liste de fichiers à traiter a une profondeur fixe, il vaut mieux utiliser la commande glob que d'utiliser un appel système à find. Même si ta recherche est à profondeur variable, il est préférable d'utiliser le module File::Find, qui est très facile d'accès.

    Sinon, une question : où déclares tu ta variable $line ?
    There's nothing like $HOME!

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je sais qu'on utilise souvent les modules pour faciliter le job, mais là ou je travaille, tout est sécurisé et on a nos propres modules qui sont similaires à ceux qui se trouvent dans CPAN, à vrai sire il y a des personnes qui bossent plus d'un an et qui n'ont jamais utilisé les modules de CPAN,
    réponse à ta question: la variable $line se trouve just après le while, pour decouper la ligne csv et avoir les champs que je veux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($field1,$field2,$field3,$field4,$field5,$field6) = split ';', $line;
    autre chose, glob ou find est la meme chose pour le traitement que j'ai.
    Merci d'avoir contribuer et aider à ça
    Encore d'autre suggestion?
    Dernière modification par djibril ; 28/12/2011 à 10h15.

  4. #4
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    File::Find est un module standard fourni avec perl, soit dit en passant. Mais si glob fait l'affaire, c'est très bien.

    As-tu envisagé d'utiliser close F; à la fin de chaque itération de foreach ? Je sais que perl peut se comporter curieusement si l'on ne ferme pas explicitement les handles.
    There's nothing like $HOME!

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/03/2013, 16h59
  2. [carte graphique] ne fonctionne plus sans raison
    Par Matth_S dans le forum Composants
    Réponses: 5
    Dernier message: 16/07/2008, 13h02
  3. Sauvegarde ne s'exécute plus sans raison visible
    Par tibal dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/03/2008, 11h48
  4. objet "this" mis à jour par une méthode sans raison
    Par Macomoul dans le forum Langage
    Réponses: 8
    Dernier message: 03/02/2008, 17h11
  5. Une erreur sans raison aparente
    Par gollou dans le forum Langage
    Réponses: 1
    Dernier message: 20/04/2007, 09h40

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