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 :

Suppression de lignes d'un fichier


Sujet :

Langage Perl

  1. #1
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut Suppression de lignes d'un fichier
    Bonjour à tous,
    J'avais un probleme avec un script shell et on m'a dit de me tourner vers le perl. Mais comme je n'y connais absolument rien en perl, je me permet donc de vous exposé mon problème. Alors voila, j'ai deux fichiers dans le premier j'ai une liste de numéro de clients dans le second, j'ai des informations sur les clients. En fait je voudrai pouvoir récupérer les infos du deuxieme fichiers ne concernant que les clients qui ne sont pas présent dans le premier fichier. Pourriez vous m'aider en me proposant quelques pistes car la je n'y comprends absolument rien ? Merci pour votre aide.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  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
    Peux-tu fournir des exemples de lignes des 2 fichiers de données ?

    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
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    comme se sont des fichiers concernants des infos clients je ne peux pas vous les montrer mais je peux vous expliquer la structure. Ils sont de cette forme :
    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
     
    fichier 1 :
    info1              info2           info3             info4
    info1              info2           info3             info4
    info1              info2           info3             info4
    info1              info2           info3             info4
    info1              info2           info3             info4
    etc...
     
    fichier 2 :
    info12            info22          info32           info42         info52       info62
    info12            info22          info32           info42         info52       info62
    info12            info22          info32           info42         info52       info62
    info12            info22          info32           info42         info52       info62
    info12            info22          info32           info42         info52       info62
    etc...
    les champs communs à ces deux fichiers sont info2 et info52
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  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
    Les séparations sont des tabulations ?

    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
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    Oui
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  6. #6
    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
    Une solution possible consisterait, à condition que les fichiers ne soient pas gigantesques (je veux dire moins de 1 Million de lignes), à charger les clés "info2" en mémoire, puis analyser le 2° fichier, et à chaque fois regarder si "info52" est déjà présent en mémoire. Si c'est le cas, on zappe la ligne.

    ca donnerait ça (passer les 2 noms de fichiers en paramètres)

    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
     
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    # récupération noms de fichiers
    my ($file1, $file2) = @ARGV;
     
    # vérification présence des fichiers
    my $usage = "usage : $0 <fichier1> <fichier2>\n";
    die($usage), unless($file1);
    die($usage), unless($file2);
    die("$file1 n'existe pas\n"), unless(-e $file1);
    die("$file2 n'existe pas\n"), unless(-e $file2);
     
    # lecture fichier1
    my %KEYS = ();
    open(INPUT1, '<', $file1) || die("impossible d'ouvrir $file1 en lecture\n");
    while(<INPUT1>)
    {
        my @fields = split( /\t/o ); # découpage selon tabulations
        my $key = $fields[1]; # on récupère le 2° champ (le 1° a l'indice 0)
        $KEYS{$key} = 1; # on stocke la clé en mémoire
    }
    close(INPUT1);
     
    # lecture fichier2
    open(INPUT2, '<', $file2) || die("impossible d'ouvrir $file2 en lecture\n");
    while(<INPUT2>)
    {
        my @fields = split( /\t/o ); # découpage selon tabulations
        my $key = $fields[4]; # on récupère le 5° champ (le 1° a l'indice 0)
        next, if ( exists $KEYS{$key} ); # on zappe, si la clé est déjà connue
        print $_; # on affiche la ligne
    }
    close(INPUT2);

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

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

  7. #7
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    Bah justement c'est ca le probleme, mes fichiers sont gigantesques. Environ 2 millions de lignes chacun...
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  8. #8
    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
    Alors je te conseille plutot de le faire en bash.

    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
     
    #!/bin/ksh
     
    # Extraction des clés uniquement
    echo "extraction des clés du fichier 1"
    cut -f2 fichier1 > cles.txt
     
    # tri du fichier des clés (nécessaire pour join)
    echo "tri du fichier 1"
    sort cles.txt -o cles.txt
    # tri du 2° fichier, sur le 5° champ (nécessaire pour join)
    echo "tri du fichier 2"
    sort fichier2 -t "\t" -k 5 -o fichier2.tmp
     
    # Jointure du fichier des clés avec le fichier de données pour marquage des lignes 
    # * sur le champ 1 du fichier des clés et le champ 5 du 2° fichier
    # * en marquant les lignes non reconnues
    # on ne conserve que les lignes qui n'ont pas trouvé de correspondance
    echo "jointure"
    join -1 1 -2 5 -t "\t" -o "1.1 2.1 2.2 2.3 2.4 2.5 2.6" -a2 -e "NONMATCHED" cles.txt fichier2.tmp | egrep "^NONMATCHED" > jointure.txt
     
    # A présent, on ne conserve que les champs du 2° fichier (ceux d'indice 2 et plus)
    echo "formattage"
    cut -d"\t" -f2- jointure.txt > resultat.txt
     
    # un peu de nettoyage à présent
    echo "nettoyage"
    rm -f cles.txt
    rm -f fichier2.txt
    rm -f jointure.txt
    Ca devrait fonctionner !

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

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

  9. #9
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    Merci beaucoup pour ton script, il est nickel a deux choses prêt. En fait je me suis trompé dans mon premier, post je veux récupérer toutes les infos du premier fichier dont les cles ne sont pas dans le deuxieme fichier (erreur de ma part ) et dans le fichier resultat.txt, il y a toujours les "NONMATCHED". Mais merci quand tu m'as fais beaucoup avancé
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  10. #10
    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
    Ok, n'oublie pas

    pour les nonmatched, c'est peut-être le cut qui ne supporte pas le "\t" comme séparateur, il doit le considérer comme séparateur intrinsèque, remplace la ligne par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cut -f2- jointure.txt > resultat.txt

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

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

  11. #11
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    Je l'ai déja fait mais le souci reste le meme, A la fin de chaque ligne du fichier de sortie j'ai : "\NONMATCHED\NONMATCHED\NONMATCHED\NONMATCHED\NONMATCHED\NONMATCHED"
    Merci encore pour ton aide
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  12. #12
    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
    Alors c'est peut-être mon join qui est foireux, essaie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    join -1 1 -2 5 -t "\t" -o "1.1 2.1 2.2 2.3 2.4 2.5 2.6" -a1 -e "NONMATCHED" cles.txt fichier2.tmp | egrep "^NONMATCHED" > jointure.txt

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

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

  13. #13
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    Si je remplace le 2 par le 1, j'ai plus rien dans mon fichier de sortie resultat.txt
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  14. #14
    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
    Je viens de relire le man de join, si je me fie à la doc, je peux réécrire mon script de cette manière:

    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
     
    #!/bin/ksh
     
    # Extraction des clés uniquement
    echo "extraction des clés du fichier 1"
    cut -f2 fichier1 > cles.txt
     
    # tri du fichier des clés (nécessaire pour join)
    echo "tri du fichier 1"
    sort cles.txt -o cles.txt
    # tri du 2° fichier, sur le 5° champ (nécessaire pour join)
    echo "tri du fichier 2"
    sort fichier2 -t "\t" -k 5 -o fichier2.tmp
     
    # Jointure du fichier des clés avec le fichier de données pour marquage des lignes 
    # * sur le champ 1 du fichier des clés et le champ 5 du 2° fichier
    # * en marquant les lignes non reconnues
    # on ne conserve que les lignes qui n'ont pas trouvé de correspondance
    echo "jointure"
    join -1 1 -2 5 -t "\t" -o "2.1 2.2 2.3 2.4 2.5 2.6" -v2 cles.txt fichier2.tmp > resultat.txt
     
    # un peu de nettoyage à présent
    echo "nettoyage"
    rm -f cles.txt
    rm -f fichier2.txt

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

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

  15. #15
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    ca ne change rien
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  16. #16
    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
    Je viens de faire des tests, il fallait juste ne pas préciser les séparateurs

    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
    #!/bin/ksh
     
    # Extraction des clés uniquement
    echo "extraction des clés du fichier 1"
    cut -f2 fichier1 > cles.txt
     
    # tri du fichier des clés (nécessaire pour join)
    echo "tri du fichier 1"
    sort cles.txt -o cles.txt
    # tri du 2° fichier, sur le 5° champ (nécessaire pour join)
    echo "tri du fichier 2"
    sort fichier2 -k 5 -o fichier2.tmp
     
    # Jointure du fichier des clés avec le fichier de données pour marquage des lignes 
    # * sur le champ 1 du fichier des clés et le champ 5 du 2° fichier
    # * en marquant les lignes non reconnues
    # on ne conserve que les lignes qui n'ont pas trouvé de correspondance
    echo "jointure"
    join -1 1 -2 5 -o "2.1 2.2 2.3 2.4 2.5 2.6" -v2 cles.txt fichier2.tmp > resultat.txt
     
    # un peu de nettoyage à présent
    echo "nettoyage"
    rm -f cles.txt
    rm -f fichier2.txt

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

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

  17. #17
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    Youpi !!! ca marche nickel a un détail pret (je sais je suis chiant) la colonne NONMATCHED sur chaque début de ligne du fichier de sortie est toujours présente. pourtant je fais bien ce que tu m'as dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cut  -f2- jointure.txt > resultat.txt
    Si tu vois d'ou ca viens n'hésite pas, je cherche de mon côté. Encore merci à toi
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  18. #18
    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
    Regarde le code que j'ai fourni juste au dessus, je n'utilise plus de "NONMATCHED"... (remplacer -a2 -e "NONMATCHED" par -v2 et retirer le egrep)

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

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

  19. #19
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    Mille excuses, je ne l'avais pas vu. En tout cas ca marche du feu de dieu. Encore merci pour ton aide précieuse, tu m'as donné un sacré coup de main.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Suppression de lignes dans un fichier
    Par elitost dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 25/09/2007, 07h52
  2. Suppression de lignes dans un fichier texte
    Par Isa31 dans le forum Langage
    Réponses: 16
    Dernier message: 26/01/2006, 20h07
  3. Suppression de lignes dans un fichier sous dos
    Par ducho dans le forum Windows
    Réponses: 2
    Dernier message: 16/05/2005, 10h20
  4. Suppression de lignes dans un fichier
    Par bubu dans le forum Linux
    Réponses: 2
    Dernier message: 13/01/2005, 10h36

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