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 :

Recup d'arguments dans un fichier .txt


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 11
    Points : 10
    Points
    10
    Par défaut Recup d'arguments dans un fichier .txt
    Bonjour,

    J'ai une floppée de fichiers texte à traiter qui ont cette tête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    stef@arthur:~/scripts$ cat fichier.txt
    Rep_Groupe = 220_Volt
    Rep_Album = Power_Games
    Rep_Trav = /home/radio/music/220_Volt/Power_Games
    Artiste = 220 Volt
    Album = Power Games
    Titre = Firefall
    Annee = 1984
    Genre = Rock
    N_Track = 01
    Duree = 244000
    Cover = cover_220-volt_power-games.jpg
    J'essaye de récuperer les valeurs une par une pour les injecter ensuite dans une BDD. Un truc du genre :
    $artist = "220 Volt"

    La derniere sequelle de mon script à cette tête :

    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
     
    #!/usr/bin/perl -w
    # use strict ;
    # use warnings ;
     
    open(FICHIER,"fichier.txt") || die "Ca open que dalle !" ;
     
    while (<FICHIER>) {
    #  print $_ ;
       my ($ARTIST, $artist) = split(/\s*=\s*/, $_, 2) ;
       my ($ALBUM, $album) = split(/\s*=\s*/, $_, 2) ;
       $art{$ARTIST} = $artist ;
       $alb{$ALBUM} = $album ;
    # Pour verif
       print $art ;
       print $aln ;
       }
       print "========================\n" ;
     
     
    close(FICHIER)
    Ca se plante assez pitoyablement Quelqu'un aurait des liens vers des exemples ?

    Stef

  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
    Plusieurs problèmes dans ton script.
    Je n'ai pas l'impression que tu réalises que tes deux split, à chaque passage de boucle, s'exercent exactement sur la même ligne. Donc, au final, tes deux tableaux associatifs %art et %alb contiennent exactement les mêmes paires clé-valeur (correspondant à la totalité des lignes de ton fichier), ce qui est d'un intérêt pour le moins douteux.
    D'autre part, dans tes sorties de contrôle en fin de boucle, tu essaies d'imprimer des variables non-initialisées, à savoir $art et $aln, ça le fait très moyen (ou alors, faudra que tu nous dises où tu les a initialisées, et surtout ce qu'elles sont censées contenir).

    Bon, la bonne nouvelle, c'est que ta boucle extrait bel et bien toutes les données du fichier (et plutôt deux fois qu'une), donc ce que tu veux est forcément extrait. Pour l'export en BDD, ça va être un poil plus compliqué. Quel type de BDD, d'abord ? Relationnelle ? C'est jouable avec ce que tu as extrait (et en utilisant le module idoine - que je ne saurais nommer au débotté), à condition bien sûr que les noms des rubriques de tes fichiers ne varient pas d'un fichier à l'autre (il y a éventuellement moyen de moyenner - à coups de regex - si les noms de rubriques ont un nombre limité de variantes).
    There's nothing like $HOME!

  3. #3
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Tous tes fichiers contiennent-ils les lignes
    Artiste = ...
    Album = ...
    Tu utilises comme clés "Artiste" et "Album", tu ne peux pas avoir une hash ayant toujours la même clé et c'est inutile, tu pourrais avoir comme clé l'artiste et comme valeur le titre par exemple.
    Ensuite, pour ta base de données dois tu seulement avoir les deux champs "Artiste" et"Album"? ou dois-tu utiliser d'autres informations tel que le nom du fichier?


    Utilise quelque chose comme ceci :
    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
    use strict ;
    use warnings ;
     
    my %art;
    my %alb;
    my $Ligne;
     
    open(FICHIER,"fichier.txt") || die "Ca open que dalle !" ;
     
    while ($Ligne=<FICHIER>)
    {
            if ($Ligne =~ /Artiste = (.*)/)
            {
                    print $1;
            }
            elsif ($Ligne =~ /Titre = (.*)/)
            {
                    print $1;
            }
    }
    print "========================\n" ;
     
     
    close(FICHIER)

    Pour ce qui est des DB, j'utilise le module DBI.
    http://search.cpan.org/~timb/DBI-1.601/DBI.pm



    Jasmine,
    -- Jasmine --

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Voici un petit script, tu peux t'en inspirer :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
    use DBI;
     
    # La base de données doit déjà exister avant de faire tourner le script
    my $driver   = "mysql";
    my $server   = "localhost";
    my $database = "nomTable";
    my $Table    = "nomTable";
    my $url      = "DBI:$driver:$database:$server";
    my $user     = "";
    my $password = "";
    ($user, $password) = PASS();
    my $DBconnect=DBI->connect( $url, $user, $password ) or die "Failure!\n";
     
    # efface la table si elle existe déjà
    # utile lors de la mise au point du script afin de ne pas devoir effacer manuellement la table entre chaque run du script
    my$sql = "drop table IF exists $Table;";
     
    # Créer la table
    my$sth = $DBconnect->prepare($sql) or print "prepare error\n";
    $sth->execute or die "Impossible de créer la table\n";
     
    # comme clé primaire il vaut mieux utiliser un nombre autoincrémenté car Artiste pourrait ne pas être unique
    my$sql1 = "CREATE TABLE $Table  (Id INT(3) NOT NULL AUTO_INCREMENT PRIMARY KEY, Artiste VARCHAR(30), Titre VARCHAR(50)) ENGINE = InnoDB;";
    my$sth1 = $DBconnect->prepare($sql1) or print "prepare error\n";
    $sth1->execute or die "Impossible de créer la table\n";
    print " TABLE $Table cree\n";
     
    my @Fichiers = qw(fich1 fich2 fich3);
    foreach my $Fichier (@Fichiers)
    {
            open(FICHIER,$Fichier) || die "IMPOSSIBLE D'OUVRIR $Fichier" ;
            print "Traitement de $Fichier\n";
            my $Ligne;
            my $Artiste;
            my $Titre;
            while ($Ligne=<FICHIER>)
            {
                    if ($Ligne =~ /Artiste = (.*)/)
                    {
                            $Artiste = $1;
                    }
                    elsif ($Ligne =~ /Titre = (.*)/)
                    {
                            $Titre = $1;
                    }
            }
            my $sql2 = "INSERT INTO $Table VALUES ('', '$Artiste','Titre');";
            my $sth2 = $DBconnect->prepare($sql2) or print "prepare error\n";
            $sth2->execute or die "Impossible d'effectuer l'insertion de $Artiste\n";
            $sth2->finish;
            close(FICHIER);
    }
     
    $DBconnect->disconnect();
    print "TERMINE\n";
     
     
     
    # récupération du mot de passe et du nom d'utilisateur
    sub PASS
            {
                    my $InFilePass = "P:/Perl/InfoPass.txt";
                    my $Ligne;
                    my $user;
                    my $password;
     
    	       open (File,"$InFilePass")  or die "Can't open file\n";
     
    	       while ($Ligne=<File>)
    	       {
                            if ($Ligne =~ /^user/)
                            {
                                    ($user)=($Ligne =~ /^user = (\w+)\s/)
                            }
                            if($Ligne =~ /^password = (\w+)\s/)
                            {
                                    ($password)=($Ligne =~ /^password = (\w+)\s/)
                            }
                    }
     
                    close (File);
                    return ($user, $password);
            }
    Bon travail,
    -- Jasmine --

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Du coup, j'ai oublié de vous remercier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ouvrir et écrire dans un fichier .txt en T-SQL
    Par joul's dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 27/10/2008, 21h04
  2. Remplacement dans un fichier .txt
    Par sebtoto62 dans le forum Langage
    Réponses: 4
    Dernier message: 28/07/2005, 13h15
  3. Date dans un fichier txt
    Par cali1983 dans le forum C++
    Réponses: 6
    Dernier message: 23/05/2005, 17h35
  4. Réponses: 10
    Dernier message: 05/10/2004, 11h28
  5. [langage] tabulation dans un fichier txt
    Par TigreRouge dans le forum Langage
    Réponses: 2
    Dernier message: 16/08/2004, 17h36

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