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

Modules Perl Discussion :

Utilisation du module Text::CSV


Sujet :

Modules Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 93
    Points : 49
    Points
    49
    Par défaut Utilisation du module Text::CSV
    Bonjour, j'utilise le module Text::CSV et j'ai un fichier .CSV qui contient des données séparées par des ";"(point virgule). La première ligne est le nom des colonnes.

    Mon problème étant que je ne vois pas comment séparer mes noms de colonnes dans un hash (car plus tard je dois synchroniser le tout avec une BD) et de même pour mes données. En se moment chaque ligne est un colonnes... Voici mon code pour le moment :

    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
     use strict;
     use Text::CSV;
     
     my $file = 'Contacts.csv';
     
     my $csv = Text::CSV->new({sep_char => ';', binary => 1});
     
     open (CSV, "<", $file) or die $!;
     
     while (<CSV>) {
    	if ($csv->parse($_)) {
    		my @columns = $csv->fields();
    		print "COLS:", @columns, ";\n\n";
    	} else {
    		my $err = $csv->error_input;
    		print "Failed to parse line: $err";
    	}
     }
     close CSV;
    Voilà, croyez-vous être capable de m'aider pour au moins le parsing des données ?

    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 93
    Points : 49
    Points
    49
    Par défaut
    J'ai faite cette méthode de parsing pour pouvoir avoir accès à chaque champ, mais croyez-vous qu'avec ce début je serai capable sans trop de problème de mettre cela dans ma BD?


    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
     
     #!/usr/bin/perl
     use strict;
     use Text::CSV;
     
     my $file = 'Contacts.csv';
     
     my $csv = Text::CSV->new({sep_char => ';', binary => 1});
     
     my @titreCols = (	"contact_id",
    					"company_id",
    					"last_name",
    					"title",
    					"email1",
    					"work_phone",
    					"work_phone_ext",
    					"cell_phone",
    					"home_phone",
    					"fax",
    					"user_id",
    					"entered_id",
    					"entered_by",
    					"last_modified_at",
    					"last_modified_by",
    					"contact_record_status");
     
     open (CSV, "<", $file) or die $!;
     
     while (<CSV>) {
    	if ($csv->parse($_)) {
    		my @columns = $csv->fields();
    		my $nbcols = scalar @columns;
    		print "\n\n";
    		for my $i (0 .. $nbcols) {
    			print "\n",$titreCols[$i],"->",$columns[$i];
    		}
    	} else {
    		my $err = $csv->error_input;
    		print "Failed to parse line: $err";
    	}
     }
     close CSV;



    Existe-t-il une meilleurs méthode?

    Merci

  3. #3
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Pour récupérer les noms des champs et mettre chaque ligne dans un hash, tu peux procéder comme ça (j'ai essayé de ne pas être trop idiomatique) :

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    use Text::CSV_XS;
     
    my $file = 'yourfile.csv'; 
    my $csv = Text::CSV_XS->new ({sep_char => ';',binary => 1, eol => $/ });
    open my $fh, "<", $file 
        or die "$file: $!";
     
    my @fields = @{$csv->getline ($fh)};
    #print join " ", @fields, "\n";
     
    while (my $row = $csv->getline ($fh)) {
        my %data;
        for (@fields) {
            if (my $value = shift @$row) {
                $data{$_} = $value;
            }
        }
        #
        # proceed the hash here
        #
        #print join(" ", map {$data{$_}} keys %data), "\n";
    }
    Bon en même temps Tie::Handle::CSV fait ça pour toi (tu peux même lui passer directement une instance d'un parseur Text::CSV_XS) mais d'un côté tu as un peu moins de contrôle (n'oublie pas qu'il tie ton fichier!).

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 93
    Points : 49
    Points
    49
    Par défaut
    salut iblis,

    J'ai un tantinet de misère avec ta méthode, non pas de la comprendre, mais de la manière dont tu t'y prend... Ne crois tu pas que ta méthode me compliquerais un peu le transfert lorsque je voudrais mettre cela dans une base de données?

    Car je cherche la procédure pour que par la suite je mette ceci dans ma BD avec le module DBI.


    Merci

  5. #5
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Bonjour.

    C'est toi qui voulais les champs de chaque enregistrement dans un hash, je t'ai juste montrer comment faire.
    Citation Envoyé par thomfort Voir le message
    Mon problème étant que je ne vois pas comment séparer mes noms de colonnes dans un hash

    Tu n'es bien sûr pas obligé de passer par un hash (encore que cela va te simplifier la vie, si les colonnes de tes tables sont identiques ou très similaires à celle du csv.

    Je ne vois pas où est ton problème maintenant. Tu lis les lignes, récupère les données, tu n'as plus qu'a écrire dans tes tables. Qu'est-ce qui te pose problème ? Ouvrir la base ? Ecrire les requêtes ? Parcourir le hash (ou le tableau) ?

    (par contre ce coup-là je ne vais pas écrire ton code).

Discussions similaires

  1. Probleme module Text::CSV et accent
    Par titi6913 dans le forum Modules
    Réponses: 2
    Dernier message: 03/07/2009, 20h20
  2. erreur lorsque j'utilise le module session
    Par vbcasimir dans le forum Modules
    Réponses: 13
    Dernier message: 14/10/2005, 13h41
  3. utilisation du module WWW::Hotmail
    Par mouette_fstt dans le forum Modules
    Réponses: 2
    Dernier message: 22/07/2005, 16h58
  4. [web] Probleme de passe de variable qd j utilise un module TK
    Par Slippers dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 19/04/2005, 17h48

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