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. #21
    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
    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?
    Comme le but n'était pas clairment affiché dans l'énoncé initial, j'ai pris pour hypothèse qu'il fallait lister toutes les relations, même partielles.
    Si l'on ne doit prendre en compte que les relations complètes, alors oui, c'est bien l'intersection qu'il faut prendre.
    L'algorithme est donc différent.

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

    line 139 : $matrix{$cle}, [@tmp];
    Ca m'apprendras à coder sans exécuter...
    Il fallait bien sur écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $matrix{$cle} = [@tmp];
    Pour sélectionner l'intersection au lieu de l'union, il est possible de procéder ainsi :
    - soit utiliser la fonction grep
    - soit utiliser le module List::Compare (fonction get_intersection à utiliser deux fois puisque le module n'accepte que 2 tables à la fois).

    Une manière de l'écrire avec un grep :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my @cles = grep { exists $matrixOfP10send{$_} && exists $matrixOfslev5recv{$_} } keys %matrixOfP12recv;
     
    # On boucle sur cette liste (contenant dans les clés du hash %cles)
    foreach my $cle (@cles) {
    ...
    (je n'ai pas exécuté ce code)
    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

  2. #22
    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
    Désolé de pas avoir répondu plus vite, j’étais sur un autre projet depuis deux jours.
    Alors Philou67430, j'ai testé avec les hash,et les grep, ca a l'air de donner ce que je veux. et c'est super rapide!!!
    Grâce a ton exemple, j'ai même pu parcourir un fichier .ini avec le module Config::inifiles, mettre les paramètres dans un hash et les utiliser. Par contre, ici, étant donne que sont des tableaux stockes dans les hash, je n'arrive pas a accéder a leur valeur. J’accède seulement a l'adresse (un eu comme en c avec les pointeurs)
    Voici ce que récupère dans OUTPUT :
    102/48 '0' /3500000000/U01000083894
    ARRAY(0xa27f1d0)
    ARRAY(0xa594ca8)
    ARRAY(0xa7dd848)
    102/48 '0' /3500000000/U08000061894
    ARRAY(0xa124358)
    ARRAY(0xa35c6c0)
    ARRAY(0xa6d6e20)
    102/48 '0' /4400000000/A15000000494_1
    ARRAY(0xa0f9ca0)
    ARRAY(0xa44b168)
    ARRAY(0xa68fb58)
    102/48 '0' /4400000000/U15000073894
    ARRAY(0xa1d7e30)
    ARRAY(0xa501858)
    ARRAY(0xa74ed40)
    102/48 '0' /3500000000/U13000054694
    ARRAY(0xa1e8290)
    ARRAY(0xa511da0)
    ARRAY(0xa75e8a8)
    102/48 '0' /4400000000/U02000062494
    ARRAY(0xa1daf88)
    ARRAY(0xa504510)
    ARRAY(0xa754b78)
    102/48 '0' /4400000000/U08000054694
    ARRAY(0xa10f1e0)
    ARRAY(0xa
    avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    foreach my $cle (@cles) {
    	print OUTPUT $cle if exists $matrixOfP12recv{$cle};
    	print OUTPUT "\n";
      print OUTPUT $matrixOfP12recv{$cle} if exists $matrixOfP12recv{$cle};
      print OUTPUT "\n";
      print OUTPUT $matrixOfP10send{$cle} if exists $matrixOfP10send{$cle};
      print OUTPUT "\n";
      print OUTPUT $matrixOfslev5recv{$cle} if exists $matrixOfslev5recv{$cle};
      print OUTPUT "\n";
    }
    saurais tu comment faire pour récupérer la ligne (@linesToTransform) associée a chaque clé??, et non son adresse?

    Thank you for your precious help

  3. #23
    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 pourrais te donner simplement la réponse, mais je vais tenter autre chose.

    Cours n°1 : les références.
    En perl, il n'existe que 3 types forts (on va se limiter à 3, mais en réalité, il en existe un peu plus) :
    - les scalaires, précédés d'un sigil $ : ils représentent une valeur singulière (une seule valeur). Le contenu de cette valeur est quelconque : entier, chaine, référence, ...
    - les tableaux, précédés d'un sigil @ : ils représentent une liste ordonnée de scalaires quelconques (et pas forcément homogène), accessibles par un indice numérique.
    - les tables de hashage, précédes d'un sigil % : ils représentent des tables de hashage associant une clé scalaire quelconque à une valeur scalaire quelconque également.

    Perl ne permet pas de définir de types structures, ou de tableaux imbriqués, ou encore de tableaux de structure. En fait, il permet beaucoup mieux : un tableau de tableau n'est qu'un tableau dont les valeurs sont des références (donc des scalaires) d'autres tableaux. Ces références de tableaux sont en fait, des tableaux anonymes (c'est à dire non rattachés directement à un symbole, à une variable. On créér se genre de références anonymes en déclarant une liste entre [ ] (ou entre { } pour une table de hashage anonyme).

    Ainsi, dans ton exemple plus haut, la table de hashage contient comme valeur associés aux clés, une référence à un tableau.

    Considérons maintenant le symbole cle représentant la clé dans la table de hashage. Pour dé-référencer ce symbole et obtenir la valeur associée, on utilise le sigil $, car c'est un scalaire. On écrit donc $cle.
    Pour la table @cle contenant la liste des clés, si l'on souhaite déférencer toute la table, on utilise @ placé devant le symbole et on obtient @cle, comme dans l'usage du foreach. Si l'on souhaite extraire une valeur (un scalaire), on utilise alors le sigil $ : $cle[0]. Et si l'on souhaite à nouveau récupérer une liste de valeur de certains indiques, donc pour obtenir à nouveau une table, on utilise à nouveau @ : @cle[3..4] retourne les clés 3 et 4.
    Et ainsi de suite pour les tables de hashage.

    Voyons à présent ce que contient $matrixOfP12recv{$cle} : un scalaire (puisque ça commence par un $). Ce scalaire est la référence anonyme au tableau qui t'intéresse (représenté par le texte ARRAY(0x....) lors du print).

    Pour obtenir la table complète, que devras-tu écrire pour déréférencer ce scalaire sous forme d'une table ?
    Et pour obtenir un élément de cette table, que devras-tu écrire ?

    La réponse avant midi...
    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

  4. #24
    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
    Think by yourself ;-)

    Donc
    $matrixOfP12recv{$cle}
    represente un tableau
    il faut donc en afficher chaque collone,
    d'ou quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      print OUTPUT  $matrixOfP12recv{$cle}[2] if exists $matrixOfP12recv{$cle}
    par exemple pour afficher le 3eme element de chaque tableau correspondant a une cle....
    apres, il faut afficher toutes les colonnes avec un boucle for?

  5. #25
    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

  6. #26
    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
    Think by yourself ;-)

    Donc $matrixOfP12recv{$cle}
    represente un tableau
    Il représente exactement une référence à un tableau.
    il faut donc en afficher chaque collone,
    d'ou quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      print OUTPUT  $matrixOfP12recv{$cle}[2] if exists $matrixOfP12recv{$cle}
    On peut l'écrire ainsi, mais personnellement, je préfère toujours utiliser l'écriture similaire au C utilisant l'opération ->, qui indique clairement que la partie gauche est une référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      print OUTPUT  $matrixOfP12recv{$cle}->[2] if exists $matrixOfP12recv{$cle}
    apres, il faut afficher toutes les colonnes avec un boucle for?
    Pour parcourir toutes les valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      foreach my $P12recv (@{$matrixOfP12recv{$cle}}) {
        ...
      }
    Et voila !
    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

  7. #27
    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
    Merci pour toute votre aide. ça m'a vraiment beaucoup aide. (ca marche super bien et ca va a une vitesse folle)
    Je ne ferme pas le cas, pcq j'ai une dernière question, et pas des moindres.

    Supposons (c'est le cas ) que je récupère deux tableaux suite a deux grep, sur les cles des differents champs. Y a t il un moyen de lier et comparer ces deux tableaux?

    Je ne pense pas que ma question soit tres clair
    Je mets "mon" 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
    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;
    }
     
     
     
    sub getMatriceExchangeOrderId{
    	my @linesToTransform = @_;
    	my (%matrix, @tmp);
    	my $i;
    	foreach $i (@linesToTransform) {
    		@tmp= split(',',$i);
                    my $cleEOI = join ",", $tmp[7];
       $matrix{$cleEOI} = [@tmp];
    	}
    	return %matrix;
    }

    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
    # Création d'une liste de toutes les clés possibles
    my %cles;
    #$cles{$_}++ foreach keys %matrixOfP12recv, keys %matrixOfP10send, keys %matrixOfslev5fixrecv;
    my @cles = grep { exists $matrixOfP10send{$_} && exists $matrixOfslev5fixrecv{$_} 
    	&& exists $matrixOfP10recv{$_} && exists $matrixOfP12send{$_}} keys %matrixOfP12recv;
    #print "@cles\n"; 
     
     
    # Création d'une liste de toutes les clés possibles
    my %clesEOI;
    my @clesEOI = grep { exists $matrixOfslev5fixsendEOI{$_} } keys %matrixOfP10recvEOI; 
     
    #print "@cles\n"; 
    my $indentEOI=1;
    foreach my $cleEOI (@clesEOI) {
    	print OUTPUT "Order Number : $indentEOI";
    	print OUTPUT "\n";
    	for(my $ind=0; $ind <10; $ind++)  {
    	  print OUTPUT  $matrixOfslev5fixsendEOI{$cleEOI}[$ind] if exists $matrixOfslev5fixsendEOI{$cleEOI};
    	  print OUTPUT ",";
    	}
    	print OUTPUT  $matrixOfslev5fixsendEOI{$cleEOI}[10];  
    	#print OUTPUT "\n";
    	for(my $ind=0; $ind <10; $ind++)  {
    	  print OUTPUT $matrixOfP10recvEOI{$cleEOI}[$ind] if exists $matrixOfP10recvEOI{$cleEOI};
    	  print OUTPUT ",";
    	}
    		print OUTPUT  $matrixOfP10recvEOI{$cleEOI}[10];  
    			print OUTPUT "\n";
    	$indentEOI++;
    }
     
    my $indent=1;
    # On boucle sur cette liste (contenant dans les clés du hash %cles)
    foreach my $cle (@cles) {
    	print OUTPUT "Order Number : $indent";
    	print OUTPUT "\n";
    	for(my $ind=0; $ind <10; $ind++)  {
    	  print OUTPUT  $matrixOfP12recv{$cle}[$ind] if exists $matrixOfP12recv{$cle};
    	  print OUTPUT ",";
    	}
    	print OUTPUT  $matrixOfP12recv{$cle}[10];  
    	#print OUTPUT "\n";
    	for(my $ind=0; $ind <10; $ind++)  {
    	  print OUTPUT $matrixOfP10send{$cle}[$ind] if exists $matrixOfP10send{$cle};
    	  print OUTPUT ",";
    	}
    	print OUTPUT $matrixOfP10send{$cle}[10];	  
    	#print OUTPUT "\n";
    	 for(my $ind=0; $ind <10; $ind++)  {
    	  print OUTPUT $matrixOfslev5fixrecv{$cle}[$ind] if exists $matrixOfslev5fixrecv{$cle};
    	  print OUTPUT ",";
    	}
    	print OUTPUT $matrixOfslev5fixrecv{$cle}[10];
    	#print OUTPUT "\n";
    	for(my $ind=0; $ind <10; $ind++)  {
    	  print OUTPUT $matrixOfP10recv{$cle}[$ind] if exists $matrixOfP10send{$cle};
    	  print OUTPUT ",";
    	}
    	print OUTPUT $matrixOfP10recv{$cle}[10];	 
    	#print OUTPUT "\n";
    	for(my $ind=0; $ind <10; $ind++)  {
    	  print OUTPUT $matrixOfP12send{$cle}[$ind] if exists $matrixOfP10send{$cle};
    	  print OUTPUT ",";
    	}
    	print OUTPUT $matrixOfP12send{$cle}[10];	 
    	print OUTPUT "\n";
    	$indent++;
    }
    Les boucles for sont pas belles, je verrai ca plus tard

    Donc il faudrait lier le champ num 7 des matricesEOI au champ num 7 des lignes traitées par getMatrice, sachant qu'on le récupère pas avec cette fonction.
    Qui n'a rien compris a ma question? MOI!

  8. #28
    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
    Donc il faudrait lier le champ num 7 des matricesEOI au champ num 7 des lignes traitées par getMatrice, sachant qu'on le récupère pas avec cette fonction.
    Qui n'a rien compris a ma question? MOI!
    Voudriez-vous dire que la nouvelle clé de comparaison des tableaux est la colonne 7 ? Dans ce cas, il faudrait reconstruire la première table en changeant de clé.

    Par lier des champs, vous entendez exactement quoi ? Vérifier l'existence ? Fusionner des colonnes pour chaque ligne ayant la même clé ? ... ?
    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

  9. #29
    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
    Et bien, il se trouve que j'ai plusieurs tableaux (8), de x lignes et 10 colonnes.
    Pour les tableaux 1,2,3,7 et 8, je dois chercher la clé correspondant aux colonnes 3,4,5 et 6 (ce qu'on a déjà fait).
    Ensuite, je dois trouver les lignes correspondantes entre les tableaux 6 et 7 en identifiant un paramètre de la colonne 6 et un autre dans la colonne 7.
    Il suffit de changer la clé dans la création du hash. et ensuite le principe est le même pour les tableaux 4 et 5.
    Le problème est que ensuite, il faut retracer le parcours d'un ordre parmi tous les tableaux, en sachant qu'il y aura toujours au moins un paramètre en commun (la colonne 6 plus haut par exemple). J’espère avoir été un peu plus clair...

  10. #30
    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
    Serait-il possible d'avoir qqch du style :
    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
    sub getMatriceEOI{
    	my @linesToTransform = @_;
    	my (%matrix, @tmp);
    	my $i;
    	foreach $i (@linesToTransform) {
    		@tmp= split(',',$i);
                    my $cleEmisEOI = join ",", @tmp[6..7];
       $matrix{$cleEOI} = [@tmp];
    	}
    	return %matrix;
    }
    my %matrixOfslev5fixrecvEOI = &getMatriceEOI(@slev5fix_recv_lines);
    my %matrixOfemis7 = &getMatriceEOI(@emis7_lines);
    my %matrixOfrecep7 = &getMatriceEOI(@recep7_lines);
    my %matrixOfslev5fixsendEOI = &getMatriceExchangeOrderId(@slev5fix_send_lines);
    my %matrixOfP10recvEOI = &getMatriceExchangeOrderId(@P10_recv_lines);
     
     
     
    # Création d'une liste de toutes les clés possibles EOI
    my %clesEOI;
    my @clesEOI = grep { exists $matrixOfslev5fixrecvEOI{0}{$_} && exists $matrixOfemis7{$_} 
    		$$ exists $matrixOfrecep7{1}{$_} } keys % matrixOfslev5fixrecvEOI;
     
     
    #print "@cles\n"; 
    my $indentEOI=1;
    foreach my $cleEOI (@clesEOI) {
    	print OUTPUT "Order Number : $indentEOI";
    	print OUTPUT "\n";
    	for(my $ind=0; $ind <10; $ind++)  {
    	  print OUTPUT  $matrixOfslev5fixrecvEOI{$cleEOI}[$ind] if exists $matrixOfslev5fixrecvEOI{$cleEOI};
    	  print OUTPUT ",";
    	}
      ...
      ...
      }
    En supposant que <--- X ---> indique aue les deux tableaux sont lies par le colonne X on a

    matrixOfslev5fixrecvEOI <--- 6 ---> matrixOfemis7
    matrixOfemis7 <--- 7 ---> matrixOfrecep7
    matrixOfrecep7 <--- 7 ---> matrixOfslev5fixsendEOI

  11. #31
    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
    OK, j'ai à peu près compris votre problématique. Cependant, une dernière question : une fois toutes les lignes des huit tableaux "reliées", que souhaitez-vous faire des valeurs qu'elles contiennent ?

    Pour résoudre votre problématique, je vous proposerais donc une alternative à ce que nous avons réalisé précédemment, et qui consiste un peu à travailler comme une base de donnée relationnelle, en créant des tableaux d'index :

    Vous chargez vos différentes tableaux dans des tableaux @matrix...
    Puis, selon vos besoins, vous créez des tables d'index sous forme de tables de hashage dont la clés sera la clé d'index, et la valeur, une référence à la ligne dans le tableau @matrix...

    Vous pourrez alors chercher les éléments liés d'un tableau avec les autres, selon la bonne clé d'index. Reste à savoir ce que vous désirez faire avec ces données liées ? Si vous souhaitez créer une nouveau tableau qui contiennent toutes les colonnes, alors je vous proposerais de "fusionner" d'abord les 5 tableaux utilisant la clé des colonnes 3 à 6, puis, de créer à nouveau un index avec comme clé les colonnes 6 à 7 sur ce tableau fusionner que le fusionner à nouveau avec les deux dernier tableaux.

    Les fonctions à réaliser :
    sub cree_index(\@,\@); # Créer et retourner une table d'index à partir du tableau fourni en paramètre et de la liste de colonne servant de clé
    sub fusionner(\%, ...); # Fusionner les tableaux pointés par les index fournis en paramètre

    Pour la création d'index :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sub cree_index {
      my ($cles, $matrix) = @_;
     
      my %index = map {
        my @tmp = split ',';
        join (",", @tmp[@$cles]) => \$_;
      } @$matrix;
     
      return %index;
    }
    Pour la fonction de fusion, il me faut un chouilla de temps en plus... et la réponse à ta question.

    Edit : vue l'heure à laquelle tu postes, je suppose que tu n'es pas sur le même fuseau horaire

    Edit2: si cela ne te dérange pas, ta problématique ressemblant fortement à un cas d'étude que je souhaitais réaliser, j'utiliserai tout ou partie de ce que je t'ai fourni ici pour mes propres besoin.
    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

  12. #32
    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 effet, je suis a Hong Kong
    Pas de pb pour la réutilisation, je passe pas mal de temps dessus, mais tu m'aides énormément donc...
    Donc en gros, la problématique est de tracer des ordres (de bourses) qui passent a travers plusieurs processus, et dont les données sont enregistres dans des .log
    J'ai déjà fait les traitements sur les .log afin de récupérer les données utiles dans des fichiers csv, et il faut tracer ces ordres en repérant les champs caractéristiques, qui varient selon le processus.
    A la fin, il faudra récupérer le time in/time out pour gérer les tps de latence et éventuellement traiter les donnes via des graphes

  13. #33
    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
    et c'est une très bonne idée l’idée de fusion, c'est ce que je cherche a réaliser, mais ce que j'ai produit jusque la me fait perdre tout ce que je gagne avec les hash.
    Et je pense que tu/vous as/avez bien compris ma problématique

  14. #34
    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
    Quand tu parles de fusion, tu parles d'ajouter toutes les colonnes d'une matrice aux autres... il n'y a pas de colonnes communes qu'il faudrait éviter de dupliquer ?
    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. #35
    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
    et c'est une très bonne idée l’idée de fusion, c'est ce que je cherche a réaliser, mais ce que j'ai produit jusque la me fait perdre tout ce que je gagne avec les hash.
    Pourrais-tu poster ce que tu as déjà écrit ?
    Quand tu dis que tu perds ce que tu as gagné avec les hash, tu veux dire en terme de performance ?
    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. #36
    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
    En effet, je suis a Hong Kong :mouarf
    Désolé d'être indiscret, mais ça te permet de poster au plus tard vers quelle heure (heure française GMT+2) ?
    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

  17. #37
    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
    qd je parlais de fusion, je parlais plutôt de créer une matrice en ajoutant toutes les lignes qui contiennent les cles.
    ce qui fait que si on a les colonnes 3..6 comme clés, et que 3 lignes contiennen ces cles, on se retrouve en sortie avec une matrice 3x10 (a la base il y a 10 champs)
    et que si ensuite, on a une clé correspondant a une seule colonne, mais que 2 lignes la contienne, on se retrouve avec une matrice 5x10. Il ne faut donc pas dupliquer les lignes, et sortir a chaque fois toutes les colonnes

    - Ici, on est a france+6H. Je bosse généralement le code de 9h a 18h (3h a 12h en fr). après, je n'ai plus accès a ma station, même en vpn. Mais je consulte le forum jusque 23h ici (17h fr)

    - je poste mon code demain, mais ce que j'ai essayé de faire, c'est faire un split sur la cle 3..6 pour avoir juste un seul élément, et avec deux boucles imbriques chercher des correspondances. Je suis pas fan de ce que j'ai fait.
    En terme de performance, et parce que d'après ce que j'ai compris du perl, on peut souvent éviter les boucles imbriquées (c'est moche et c'est long).
    Et puis ca donne un code très statique (j'entends par la difficilement adaptable)

  18. #38
    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
    qd je parlais de fusion, je parlais plutôt de créer une matrice en ajoutant toutes les lignes qui contiennent les cles.
    ce qui fait que si on a les colonnes 3..6 comme clés, et que 3 lignes contiennen ces cles, on se retrouve en sortie avec une matrice 3x10 (a la base il y a 10 champs)
    Si je comprends bien, tes tableaux à fusionner contiennent tous les mêmes 10 colonnes, avec le même contenu lorsque les cles (colonnes 3 à 6) concordent ?
    et que si ensuite, on a une clé correspondant a une seule colonne, mais que 2 lignes la contienne, on se retrouve avec une matrice 5x10.
    Le ensuite signifie quoi ? On ajoute des lignes à une des tables ?
    On ajoute de nouvelles tables ?
    Pourquoi passe-t-on de 3 lignes à 5 lignes en ajoutant une clé ?
    Je suis perdu
    Il ne faut donc pas dupliquer les lignes, et sortir a chaque fois toutes les colonnes
    Voir ma question précédente sur le contenu des colonnes. En plus du code, il serait intéressant de fournir des extraits des tableaux à fusionner (tous les 8).

    - Ici, on est a france+6H. Je bosse généralement le code de 9h a 18h (3h a 12h en fr). après, je n'ai plus accès a ma station, même en vpn. Mais je consulte le forum jusque 23h ici (17h fr)
    C'est noté
    - je poste mon code demain, mais ce que j'ai essayé de faire, c'est faire un split sur la cle 3..6 pour avoir juste un seul élément, et avec deux boucles imbriques chercher des correspondances. Je suis pas fan de ce que j'ai fait.
    En terme de performance, et parce que d'après ce que j'ai compris du perl, on peut souvent éviter les boucles imbriquées (c'est moche et c'est long).
    Et puis ca donne un code très statique (j'entends par la difficilement adaptable)
    OK, donc tu m'expliques que ton code actuel n'est pas basé sur les tables de hashage dont on a discuté plus haut, c'est bien cela ?
    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. #39
    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
    Si je comprends bien, tes tableaux à fusionner contiennent tous les mêmes 10 colonnes, avec le même contenu lorsque les cles (colonnes 3 à 6) concordent ?
    Non il n'y a que les clés qui concordent

    Enfin, je t'envoie des images plutôt que de longues explications, dis moi si c'est plus clair

    Et si, je code avec les hash, mais comme je veux faire correspondre les clés, et que parfois une clé est composée de plusieurs éléments (colonnes 3..6 par exemple), et d'autre fois un seul, perl le reconnait comme un tout non dissociable. D'ou le split
    Images attachées Images attachées   

  20. #40
    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
    OK, c'est donc plutôt une concaténation simple de tous les tableaux, suivies d'un tri particulier sur les clés... est-ce que l'on peut considérer ceci ainsi ?

    Si un simple tri peut faire l'affaire, dans ce cas un quelque chose de ce genre devrait faire l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %allMatrix = map { my @tmp = split /,/;
      (join ",", @tmp[3..6]) => $_;
    } @matrixOfP12recv, @matrixOfP10send, ...;
     
    foreach my $key (sort keys %allMatrix) {
      # Utiliser $allMatrix{$key}
    }
    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

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