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 : 42
    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 !

  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 : 42
    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 !

  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 : 42
    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");
    }

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