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

SAS Base Discussion :

Utilisation de lag pour supprimer des lignes


Sujet :

SAS Base

  1. #1
    Invité
    Invité(e)
    Par défaut Utilisation de lag pour supprimer des lignes
    Bonjour,
    j'ai une table qui se présente comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    aaaa\
    adft\
    fic1.txt
    fic2.txt
    adft\
    fic.txt
    fic2.txt
    aoiut\
    aiut\
    aurt\
    j'aimerai avoir le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    adft\
    fic1.txt
    fic2.txt
    adft\
    fic.txt
    fic2.txt
    j'ai essayé avec lag mais sa n'a pas marché
    l'idée c'est si deux valeurs qui contiennent un \ se succèdent d'éliminer la première.

    Merci de votre aide.
    Julie.

  2. #2
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Bonjour Julia,
    Il suffit d'isoler les lignes contenant un \, supprimer les doublons puis concatener avec ceux qui ne contiennent pas un \

    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
    data test;
    input var_$;
    cards;
    aaaa\
    adft\
    fic1.txt
    fic2.txt
    adft\
    fic.txt
    fic2.txt
    aoiut\
    aiut\
    aurt\
    ;
    run;
     
    data test2 test;
    set test;
    if index(var_,'\') then output test2;
    else output test;
    run;
     
    proc sort data=test2 nodupkey;
    by var_;
    run;
     
    data test;
    set test test2;
    run;

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour la réponse, Mais ce n'est pas ce que je recherche;

    pas de trie ,car il faut garder la structure du fichier.
    les enregistrements avec des / correspondent aux répertoires, les autres à leurs contenue, donc le but c'est d'éliminer tous les répertoires qui ne contiennent pas de fichiers textes.d'où je suis obligée de garder la structure du fichier.

  4. #4
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Je n'ai pas trop compris le passage de la table une à la deux

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 113
    Points : 107
    Points
    107
    Par défaut
    Il suffit de créer une variable qui te permettra de retrier dans le bonne ordre. car supprimer une ligne précédente en sas ce n'est pas très facile sinon.

    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
     
    DATA test;
    input var_$;
    cards;
    aaaa\
    adft\
    fic1.txt
    fic2.txt
    adft\
    fic.txt
    fic2.txt
    aoiut\
    aiut\
    aurt\
    ;
    run;
     
    data test;
       set test;
       numero = _n_;
    run;
     
    proc sort data = test; by descending numero ; run;
     
     
     data test2;
        set test;
        retain var2 0;
        if (index(var_, '\') > 0 and var2 = 0) or index(var_, '\') = 0 then output ;
        if index(var_, '\') > 0 then var2 = 1 ;
        else var2 = 0;
    run;
     
    proc sort data = test2; by numero ; run;

  6. #6
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonjour,

    je te propose ce code avec deux proc sort et un lag

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    data test; set test;ordre=_N_;run;
    proc sort data=test; by descending ordre;run;
     
    data test; set test;
    i_txt=lag(substr(var_,length(var_)-3,4)='.txt');
    run;
     
    proc sort data=test; by ordre;run;
     
    data test; set test; 
    if substr(var_,length(var_),1)='\' and (i_txt=0 or i_txt=.) then delete;
    drop i_txt ordre;run;

  7. #7
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 372
    Points
    372
    Par défaut
    bonjour,

    un début de réponse
    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
    data test;
    input valeur $ ;
    cards;
    aaaa\
    adft\
    fic1.txt
    fic2.txt
    adft\
    fic.txt
    fic2.txt
    aoiut\
    aiut\
    aurt\
    ;
    run;
     
     
    data test2;
    merge test test (firstobs=2 rename=(valeur=valeur_suivante));
    if reverse(strip(valeur))=:"\" and reverse(strip(valeur_suivante))=:"\" then delete;
    /*drop valeur_suivante;*/
    run;
    L'idée est d'accoler la table avec elle-même mais décalée de 1 ligne (firstobs=2).

    Comment gères-tu les cas où plus de 2 valeurs XXX\ se suivent ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci à tous de vos réponses.

    Et oui SASADM en réalité mon seul soucisc’était comment gérer les deux valeurs (répertoires) qui se suivent succèdent

Discussions similaires

  1. problème pour supprimer des lignes d'un fichier
    Par NicoO_O dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 17/01/2008, 07h23
  2. Réponses: 2
    Dernier message: 13/11/2007, 10h19
  3. sed et boucle pour pour supprimer des lignes
    Par edouardj dans le forum Linux
    Réponses: 15
    Dernier message: 09/11/2007, 12h39
  4. Réponses: 1
    Dernier message: 17/05/2006, 09h19
  5. Shell pour supprimer des lignes d'un fichier
    Par nelsa dans le forum Autres langages
    Réponses: 2
    Dernier message: 20/09/2004, 12h26

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