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 :

Text::CSV_XS ou use Tie::CSV_File;


Sujet :

Modules Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Points : 12
    Points
    12
    Par défaut Text::CSV_XS ou use Tie::CSV_File;
    Salut a tous,
    Que pensez vous de ces deux modules :
    Text::CSV_XS ou use Tie::CSV_File;
    Je dois faire du traitement de fichiers csv, (il s'agit en fait de tracer un ordre identifie par des champs particuliers au travers de 6 fichiers .csv )
    Les fichiers font au minimum 30 000 lignes chacun,et pour chaque ligne les différents champs sont dans une colonne, et il faut tout parcourir, récupérer les infos et les mettre ailleurs.
    je pensais utiliser Tie::CSV_File pour avoir les infos sous forme de matrice (plus facile d’accès mm si plus lourd), et ensuite utiliser des boucles while. (je suis un peu retissant a utiliser des fonctions tels que grep, mais après tout pourquoi pas)
    Qu'en pensez vous?

  2. #2
    Membre averti
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Points : 328
    Points
    328
    Par défaut
    Salut,

    As-tu pensé à utiliser le module DBD::CSV ?
    C'est vrai que c'est un peu lourd, mais vraiment pratique.

    Lilian.

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Bonjour,

    Je vous conseil tout de même d'utiliser le module Text::CSV_XS ou Text::CSV plus adapté à la manipulation des fichiers CSV.

  4. #4
    Membre averti
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Points : 328
    Points
    328
    Par défaut
    http://perlmeme.org/tutorials/parsing_csv.html

    Vois ce qui répond le mieux à ton besoin.

    Lilian.

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je complèterais la question d'olivierHK par celle-ci : quels sont parmi ces modules, ceux qui sont compatibles avec des fichiers CSV non chargeable en mémoire (pour cause de taille), donc qui ne traite le fichier qu'au fil de l'eau. A priori il y a Text::CSV. Quid des autres ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  6. #6
    Membre averti
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Points : 328
    Points
    328
    Par défaut
    C'est une bonne question, je me suis déjà posé cette question, mais je n'y ai pas trouvé de réponse.
    Si quelqu'un a la réponse, je suis intéressé.

    Lilian.

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Points : 12
    Points
    12
    Par défaut
    Bon ben alors voila, je pense que j'utilise une solution qui fonctionne mais qui est très lourde. Parce que de toute façon, Tie::Csv ne veut pqs s'installer, rien a faire. (Plusieurs personnes au boulot ont regarde, c'est crame).
    a partir d'un fichier csv propre que j'ai crée a l'aide d'un autre script, je crée une matrice pour accéder aux éléments plus facilement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sub getMatrice{
    	my @linesToTransform = @_;
    	my (@matrix, @tmp);
    	my $i;
    	foreach $i (@linesToTransform) {
    		@tmp= split(',',$i);
    		push @matrix, [@tmp];
    	}
    	return @matrix;
    }
    ensuite je compare les différents champs et si la condition est vrai, je traite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	for (my $i1 = 1; $i1 < $P12recvsize; $i1++) {
    		for (my $i2 = 1; $i2 < $P10sendsize; $i2++) {
    			if ( ($matrixOfP12recv[$i1][3] eq $matrixOfP10send[$i2][3]) 
    				&& ($matrixOfP12recv[$i1][4] eq $matrixOfP10send[$i2][4]) 
    				&& ($matrixOfP12recv[$i1][5] eq $matrixOfP10send[$i2][5])
    				&& ($matrixOfP12recv[$i1][6] eq $matrixOfP10send[$i2][6]) ) {
    c'est pas très beau, c'est lent, mais ça a l'air de fonctionner (les matrices sont au mininum de taille 30 000 x 7)

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Citation Envoyé par olivierHK Voir le message
    c'est pas très beau, c'est lent, mais ça a l'air de fonctionner (les matrices sont au mininum de taille 30 000 x 7)
    D'où l'intérêt d'utiliser Text::CSV_XS qui est propre, très rapide (extension XS voulant dire du code C derrière).

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Points : 12
    Points
    12
    Par défaut
    en réalité, la création des matrices est assez rapide et efficace.
    Ce sont les boucles imbriquées qui sont longues, mais je viens de demander au chef de projet, apparemment il n' y a qu'une occurrence pour chaque relation. Je vais donc plutôt utiliser des boucles while.

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    L'usage des indices de tableau (et des boucles associées à ces indices) est rarement nécessaire en perl. Il est toujours plus judicieux d'utiliser les fonctions d'itération sur les tableaux pour cela (sauf dans de rares cas où l'on souhaite synchroniser plusieurs tables, mais là encore, il existe des modules qui le permettent facilement).
    Ainsi, on peut ré-écrire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	for (my $i1 = 1; $i1 < $P12recvsize; $i1++) {
    		for (my $i2 = 1; $i2 < $P10sendsize; $i2++) {
    			if ( ($matrixOfP12recv[$i1][3] eq $matrixOfP10send[$i2][3]) 
    				&& ($matrixOfP12recv[$i1][4] eq $matrixOfP10send[$i2][4]) 
    				&& ($matrixOfP12recv[$i1][5] eq $matrixOfP10send[$i2][5])
    				&& ($matrixOfP12recv[$i1][6] eq $matrixOfP10send[$i2][6]) ) {
    ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	foreach my $P12recv (@matrixOfP12recv) {
    		foreach my $P10send (@matrixOfP10send) {
    			if ( $P12recv->[3] eq $P10send->[3]) 
    				&& ($P12recv->[4] eq $P10send->[4]) 
    				&& ($P12recv->[5] eq $P10send->[5])
    				&& ($P12recv->[6] eq $P10send->[6]) ) {
    Dans cette version épurée, il n'est plus nécessaire de se poser de question sur l'indice, son incrément, son initialisation, son test de fin...

    Cela dit, cela ne devrait pas changer fondamentalement les performances de l'algorithme. Ca le rend simplement plus lisible et maintenable.

    Une manière de rendre l'opération plus rapide serait par exemple, plutôt que de charger les CSV dans des tables, de les charger dans des hash dont la clé serait une combinaison des 4 colonnes de 3 à 6 utilisées dans ta comparaison :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sub getMatrice{
    	my @linesToTransform = @_;
    	my (%matrix, @tmp);
    	my $i;
    	foreach $i (@linesToTransform) {
    		@tmp= split(',',$i);
                    my $cle = join "/", @tmp[3..6];
    		$matrix{$cle}, [@tmp];
    	}
    	return %matrix;
    }
    A l'usage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	foreach my $P12recv (keys $matrixOfP12recv) {
    		if (!exists $matrixOfP10send{$P12recv}) {
    			die "Pas de relation pour [$P12recv]";
    		}
    		else {
    			# Utiliser $matrixOfP10send{$P12recv} et $matrixOfP12recv{$P12recv}
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Points : 12
    Points
    12
    Par défaut
    Alors Philou67430, j'avais pensé a utilisé des hash, sans trop savoir comment, mais le je vois comment tu fais concrètement donc merci.
    Donc si j'utilise ton code en l'adaptant a mes besoins,
    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
       my $newi1;
     	my $newi2;
    	for (my $i1 = 1; $i1 < $P12recvsize; $i1++) {
    		my $i2 = 1;
     		my $i3 = 1;
    		while ($i2 < $P10sendsize){
    			if (   ($matrixOfP12recv[$i1][3] eq  $matrixOfP10send[$i2][3] ) 
    					&& ($matrixOfP12recv[$i1][4] eq  $matrixOfP10send[$i2][4] ) 
    					&& ($matrixOfP12recv[$i1][5] eq  $matrixOfP10send[$i2][5] )
    					&& ($matrixOfP12recv[$i1][6] eq  $matrixOfP10send[$i2][6] ) ) {
    							$newi1 = $i1;
    							$newi2 = $i2;
    							$counter++;
    							$i2 = $P10sendsize;
    				} else {
    					$i2++;
    				}					
    				while ($i3 < $slev5recvsize) {
    					#print "newI2   :  $newi2\n";
    					if (  ( $matrixOfP10send[$newi2][3] eq $matrixOfslev5recv[$i3][3]) 
    						&&  ( $matrixOfP10send[$newi2][4] eq $matrixOfslev5recv[$i3][4])
    						&&  ( $matrixOfP10send[$newi2][5] eq $matrixOfslev5recv[$i3][5])
    						&&  ( $matrixOfP10send[$newi2][6] eq $matrixOfslev5recv[$i3][6]) ) {
    								print OUTPUT "Order N : $counter";
    								print OUTPUT "\n";
    								print OUTPUT $P12_recv_lines[$newi1];
    								print OUTPUT $P10_send_lines[$newi2];
    								print OUTPUT $slev5_recv_lines[$i3];
    								print OUTPUT "\n";
    								$i3 = $slev5recvsize;
    						} else {
    								$i3++;
    						}
    				}
    			}
    		}
    devient
    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
    foreach my $P12recv (keys $matrixOfP12recv) {
    		if (!exists $matrixOfP10send{$P12recv}) {
    			die "No relation for  [$P12recv]";
    		}
    		else {
    		  foreach my $P10send (keys $matrixOfP10send) {
    		  	if (!exists $matrixOfslev5recv{$P12recv}) {
    					die "No relation for  [$P10send]";
    				} else {
    				print OUTPUT $P12recv;
    				print OUTPUT $P10send;
    				print OUTPUT $matrixOfslev5recv{$P12recv};
    				}
    			}
    		}
    }
    ou alors je suis complètement a coté de la plaque. Pcq le premier code fonctionne.

  12. #12
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Non, tu n'as justement pas besoin de la deuxième boucle, puisque si la relation existe, tu y accèdes directement par la clé de l'autre table... c'est donc beaucoup plus simple à écrire, et beaucoup plus rapide également car l'accès à un élément de hash est quasiment direct.

    Edit : pardon, je n'avais pas vu l'introduction de la 3e table... pourrais-tu expliciter ??
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  13. #13
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Points : 12
    Points
    12
    Par défaut
    Alors je vois le lien entre P12 et P10,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    foreach my $P12recv (keys $matrixOfP12recv) {
    		if (!exists $matrixOfP10send{$P12recv})
    mais je ne vois pas le lien entre P10 et slev5 si le lien entre P12 et P10 existe.
    Je joins une image (c'est toujours plus clair que de longues phrases)
    Donc en gros, pour les champs rouges dans P12, il faut trouver les meme dans P10 et slev5 et copier les 3 lignes dans un csv.
    En tout cas, merci de prendre le temps de m'aider
    Images attachées Images attachées  

  14. #14
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Est-ce que l'ensemble des clés de P12 correspond exactement à l'ensemble des clés de P10 et à l'ensemble des clés de slev5 ? (exactement, c'est à dire qu'il n'existe aucune clé dans l'une des tables qui ne soit pas présente dans les autres)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  15. #15
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Si tel est le cas, il suffit de parcourir les clés de P12 et d'utiliser cette clé pour accéder à tous les tables (sans refaire de boucle) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    foreach my $P12recv (keys $matrixOfP12recv) {
      if (!exists $matrixOfP10send{$P12recv} || !$exists $matrixOfslev5recv{$P12recv}) {
        warn "La clé $P12recv n'est pas présente dans tous les fichiers. Elle est donc ignorée\n";
        next;
      }
      # Utiliser $matrixOfP12recv{$P12recv}, $matrixOfP10send{$P12recv} 
      # et $matrixOfslev5recv{$P12recv} pour réaliser la fusion, sans aucune
      # boucle supplémentaire
      # ...
    }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  16. #16
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Points : 12
    Points
    12
    Par défaut
    oui c'est possible. Il peut y avoir des lignes présentes dans P12, P10 et absentes dans slev5 par exemple. Je ne vois pas vraiment le pourquoi de la question. ne peut-on pas traiter ça avec des if?

  17. #17
    Membre averti
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Points : 328
    Points
    328
    Par défaut
    All,

    Il y a quelque temps j'ai eu à écrire un générateur de rapport de qualimétrie de code (rapport au format OOXML) (violation de règles de codage). J'ai utilisé DBD::CSV pour parser les fichiers CSV...
    J'ai probablement fait une connerie, c'est vrai que le temps de traitement est long.

    Djibril, selon toi, le gain de temps est il important en utilisant Text::CVS_XS ? Parcequ'il me semble que DBD::CSV s'appuie sur Text::CSV_XS ?

    The DBD::CSV driver internally uses the Text::CSV_XS module, version 0.16 or later, for reading and writing CSV files.

    Merci,
    Lilian.

  18. #18
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par olivierHK Voir le message
    oui c'est possible. Il peut y avoir des lignes présentes dans P12, P10 et absentes dans slev5 par exemple. Je ne vois pas vraiment le pourquoi de la question. ne peut-on pas traiter ça avec des if?
    Si on peut, le problème est qu'il faut une boucle sur l'ensemble des clés possibles. Il faut donc commencer par construire une table contenant l'union de toutes les clés possibles des 3 tableaux, et boucler sur cette table de clé, plutôt que sur les clés d'une des tables au hasard (comme dans mon exemple, la table P12).

    Voici alors comment procéder (une méthode parmi d'autres) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # Création d'une liste de toutes les clés possibles
    my %cles;
    $cles{$_}++ foreach keys %matrixOfP12recv, keys %matrixOfP10send, keys %matrixOfslev5recv;
     
    # On boucle sur cette liste (contenant dans les clés du hash %cles)
    foreach my $cle (keys %cles) {
      print OUTPUT $matrixOfP12recv{$cle} if exists $matrixOfP12recv{$cle};
      print OUTPUT $matrixOfP10send{$cle} if exists $matrixOfP10send{$cle};
      print OUTPUT $matrixOfslev5recv{$cle} if exists $matrixOfslev5recv{$cle};
    }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  19. #19
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par lilian_h Voir le message
    Djibril, selon toi, le gain de temps est il important en utilisant Text::CVS_XS ? Parcequ'il me semble que DBD::CSV s'appuie sur Text::CSV_XS ?
    A priori, Text::CSV utilise également Text::CVS_XS (s'il est installé je suppose), comme le stipule sa description :
    Citation Envoyé par perldoc Text::CVS
    DESCRIPTION
    Text::CSV provides facilities for the composition and decomposition of
    comma-separated values using Text::CSV_XS or its pure Perl version.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  20. #20
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Points : 12
    Points
    12
    Par défaut
    Envoyé par Philou67430
    Si on peut, le problème est qu'il faut une boucle sur l'ensemble des clés possibles. Il faut donc commencer par construire une table contenant l'union de toutes les clés possibles des 3 tableaux, et boucler sur cette table de clé, plutôt que sur les clés d'une des tables au hasard (comme dans mon exemple, la table P12).
    Ok, peut être que je me trompe (ou que je chipote), mais ne faut-il pas plutôt faire l'intersection de toutes les clés existantes? Le but étant de ne ressortir que les associations existantes?

    By the way, avec ta fonction getMatrice, voila ce que l’interpréteur me ressort :


    Useless use of hash element in void context at ./hash.pl line 139.
    Useless use of anonymous list ([]) in void context at ./hash.pl line 139.
    line 139 : $matrix{$cle}, [@tmp];

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sub getMatrice{
    	my @linesToTransform = @_;
    	my (%matrix, @tmp);
    	my $i;
    	foreach $i (@linesToTransform) {
    		@tmp= split(',',$i);
                    my $cle = join "/", @tmp[3..6];
    		$matrix{$cle}, [@tmp];
    	}
    	return %matrix;
    }

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/07/2014, 11h51
  2. Réponses: 9
    Dernier message: 02/03/2012, 12h06
  3. Réponses: 4
    Dernier message: 06/07/2008, 13h00
  4. afficher du texte
    Par Mau dans le forum OpenGL
    Réponses: 10
    Dernier message: 24/06/2003, 15h31

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