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 :

Ecrire dans un fichier avec uen contrainte d'unicité


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 34
    Points
    34
    Par défaut Ecrire dans un fichier avec uen contrainte d'unicité
    Bonjour

    Je veux puiser des données d'une liste mais je veux les écrire une seule fois si 4 champs a,b,c,d sont égaux ligne par ligne.

    J'ai fait un code qui teste si deux ligbnes sont égales suivant ces 4 champs mais ça ne finctionne pas parce que si les 2 lignes ne sont pas égales la 1ére peut être égale à la 3éme et ainsi de suite . Voici 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
    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    use strict;
    my ($fichTIA, $fichCOPtf) = ("TIA061010.ELI","COPtf.txt");
    #my ($fichTIA, $fichCOPtf) = ("DataTIA.ELI","COPtfSmall.txt");
    my ($centre,$old_centre);
    my ($ptf, $old_ptf);
    my ($ptfData, $old_ptfData);
    my ($isFileCentreOpened);
    my ($firstPtf) = ("true");
    my @tabData;
    my @tabDataProduit;
    my @cleProduit;
    my @old_cleProduit;
     
    $, = "\t";
    $\ = "";
     
    open(FILE_PtfCentre, "<$fichCOPtf") || die "File $fichCOPtf Erreur E/S : $!\n";
    open(FILE_DATA, "<$fichTIA") || die "File $fichTIA Erreur E/S : $!\n";
     
    while (<FILE_PtfCentre>) {
            my @tab = split(';',$_);
            $centre = $tab[1];
            $ptf = $tab[2];
            $centre =~ s/\s+$//; #right trim
            $ptf =~ s/\s+$//; #right trim
            #print "$centre,$ptf.\n";
     
            # Change de fichier centre a chaque nouveau centre
            if($centre ne $old_centre) {
                    if( FILE_OUT_CENTRE) {
                            close FILE_OUT_CENTRE;
                    }
                    #open(FILE_OUT_CENTRE, ">Out/CO_$centre.txt") || die "File Out/CO_$centre.txt Erreur E/S : $!\n";
                    open(FILE_OUT_CENTRE, ">OutProduit/produits.txt") || die "File OutProduit/peoduits.txt Erreur E/S : $!\n";
     
            }
     
            # Peuple le portefeuille courant
            #if(@tabData){
         if(@tabDataProduit){
                            $ptfData = $tabData[3];
                            $tabData[2] = $centre;
                            $tabData[3] = $ptf;                       
                            #on découpe le produit qui est à partir du 12éme élément
                            @tabDataProduit=split(";",$tabData[12]);                       
                             if(!($old_cleProduit[0] eq $cleProduit[0]&&$old_cleProduit[1] eq $old_cleProduit[1]&&$old_cleProduit[2] eq $old_cleProduit[2] && $old_cleProduit[3] eq $old_cleProduit[3])){
     
                             print FILE_OUT_CENTRE $tabDataProduit[0],";",$tabDataProduit[3],";",$tabDataProduit[4],";",$tabDataProduit[5],";",$tabDataProduit[1],";",$tabDataProduit[19],";",$tabDataProduit[2],";",$tabDataProduit[16],";","\n";
                             }
    						 $old_ptfData = $ptfData;
    						 #assignation des anciennes valeurs de  la clé
                            $old_cleProduit[0]=$cleProduit[0];
    						$old_cleProduit[1]=$cleProduit[3];
    						$old_cleProduit[2]=$cleProduit[4];
    						$old_cleProduit[3]=$cleProduit[5];
            }
            BOUCLE: while ("true") {
                    while (<FILE_DATA>) {
                           # @tabData = split("\t",$_);
                            @tabData = split("\t",$_);
                            $ptfData = $tabData[3];
                            if(!$firstPtf) {
                                    last BOUCLE if $ptfData ne $old_ptfData;
                            } else {
                                    $firstPtf = ""; #false
                            }
                            $tabData[2] = $centre;
                            $tabData[3] = $ptf;                     
                            #on découpe le produit qui est à partir su 12éme élémzent
                            @tabDataProduit=split(";",$tabData[12]);
                            $cleProduit[0]=$tabDataProduit[0];
    						$cleProduit[1]=$tabDataProduit[3];
    						$cleProduit[2]=$tabDataProduit[4];
    						$cleProduit[3]=$tabDataProduit[5];
    						if(!($old_cleProduit[0] eq $cleProduit[0]&&$old_cleProduit[1] eq $old_cleProduit[1]&&$old_cleProduit[2] eq $old_cleProduit[2] && $old_cleProduit[3] eq $old_cleProduit[3])){
                             print FILE_OUT_CENTRE $tabDataProduit[0],";",$tabDataProduit[3],";",$tabDataProduit[4],";",$tabDataProduit[5],";",$tabDataProduit[1],";",$tabDataProduit[19],";",$tabDataProduit[2],";",$tabDataProduit[16],";","\n";
    						}	
                            $old_ptfData = $ptfData;
                            #assignation des anciennes valeurs de  la clé
                            $old_cleProduit[0]=$cleProduit[0];
    						$old_cleProduit[1]=$cleProduit[3];
    						$old_cleProduit[2]=$cleProduit[4];
    						$old_cleProduit[3]=$cleProduit[5];
                    }
                    # On est a la fin de FILE_DATA il faut reprendre au début
                    close FILE_DATA;
                    open(FILE_DATA, "<$fichTIA") || die "Erreur E/S : $!\n";
            }
     
            $old_ptf = $ptf;
            $old_centre = $centre;
    }
    close FILE_OUT_CENTRE;
    close FILE_PtfCentre;
    close FILE_DATA;
    Comment tester si la ligne que je veux écrire n'y est qu'une seule fois et si c'est pas possible comment l'update?

  2. #2
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    C'est assez simple, tu ouvres le fichier qui contient les 4 colonnes, tu les concatènes, tu obtiens une ligne. Tu stockes cette ligne comme clé d'une hash.
    Tu répètes l'opération pour chaque ligne du fichier.

    A la fin, tu n'as plus qu'à écrire dans le fichier de sortie l'ensemble des clés de la hash, qui seront par définition uniques !

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 34
    Points
    34
    Par défaut
    Bonjour

    merci de ta réponse mais dans les lignes il ya aussi d'autres éléments comment je fais donc dans ce cas?

  4. #4
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Que je comprenne bien, tu veux tester l'unicité des clés A,B,C et D.

    Si 2 lignes ont ces 4 colonnes identiques, tu veux écrire tout le contenu d'une seule de ces 2 lignes c'est bien ça ?

    alors il te suffit de passer par la même méthode que ce que je te disais, mais tu associes en plus à la clé la ligne complète:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $hash{"$a$b$c$d"} = $ligne;
    Ainsi, tu auras juste à récupérer l'ensemble des lignes stockées dans la hash, avec une unicité des clés préservée !

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  5. #5
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 34
    Points
    34
    Par défaut
    merci pour ta réponse je teste

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par MarneusCalgarXP
    Que je comprenne bien, tu veux tester l'unicité des clés A,B,C et D.

    Si 2 lignes ont ces 4 colonnes identiques, tu veux écrire tout le contenu d'une seule de ces 2 lignes c'est bien ça ?

    alors il te suffit de passer par la même méthode que ce que je te disais, mais tu associes en plus à la clé la ligne complète:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $hash{"$a$b$c$d"} = $ligne;
    Ainsi, tu auras juste à récupérer l'ensemble des lignes stockées dans la hash, avec une unicité des clés préservée !
    tout marche mais je n'arrive pas à printer le reste de la ligne à part le premiere champ

  7. #7
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach my $line (values %hash)
    {
        print($line . "\n");
    }

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

Discussions similaires

  1. ecrire dans un fichier avec talend oen studio
    Par romyos dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 09/02/2009, 21h29
  2. Ecrire dans un fichier avec SPOOL
    Par vero1013 dans le forum SQL
    Réponses: 1
    Dernier message: 26/06/2008, 17h44
  3. Réponses: 1
    Dernier message: 24/04/2008, 09h07
  4. Écrire dans un fichier avec shell
    Par dams78 dans le forum Linux
    Réponses: 5
    Dernier message: 07/12/2006, 17h56
  5. Ecrire dans un fichier avec PL/SQL (oracle)
    Par Titouf dans le forum PL/SQL
    Réponses: 3
    Dernier message: 02/10/2005, 06h36

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