Discussion: Concaténer des lignes [DATA]

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    février 2013
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2013
    Messages : 337
    Points : 229
    Points
    229

    Par défaut Concaténer des lignes

    Bonjour,

    J'ai un problème qui à mon avis nécessite l'utilisation d'un RETAIN et je n'arrive pas du tout à obtenir ce que je souhaite et le résultat est assez bizarre.

    Je dois faire mes opérations au niveau identifiant et catégories (retour à 0 quand on change d'identifiant et de catégorie).

    Voici un jeu de données d'exemple :

    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 table;
        ID = 1; CAT = 1; VAL = "Bonjour"; output;
     
        ID = 2; CAT = 1; VAL = "Hello"; output;
        ID = 2; CAT = 1; VAL = "Hi"; output;
     
        ID = 3; CAT = 1; VAL = "Bonjour"; output;
        ID = 3; CAT = 1; VAL = "Hi"; output;
        ID = 3; CAT = 1; VAL = "Hello"; output;  
     
        ID = 4; CAT = 1; VAL = "Bonjour"; output;
        ID = 4; CAT = 1; VAL = "Hello"; output;
        ID = 4; CAT = 2; VAL = "Hi"; output;   
    run;
    Je veux concaténer avec COMPRESS tous les enregistrements par ID et CAT, et donc avoir, par exemple, pour l'ID 2, "Hello sur la première ligne" et "Hello/Hi" sur la seconde.

    Ce que je fais ne donne rien de bon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data table_2;
        length valall $100;
        retain valall;
        set table;
        by ID CAT;
        if first.cat then valall = val;
        else valall = compress(lag(valall)||"/"||val);
    run;
    Je ne comprends absolument pas ce qu'il se passe, ni pourquoi SAS retient une valeur qui n'est pas celle de l'ID en question. Quelque soit la variable en RETAIN ou en FIRST, ça ne marche pas.

    Auriez-vous un conseil pour m'aider ?

    Merci beaucoup,

    alers

  2. #2
    Membre confirmé
    Inscrit en
    novembre 2009
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 266
    Points : 546
    Points
    546

    Par défaut [DATA] Concaténer des lignes

    Bonjour,

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data table_2;
        set table;
        by ID CAT;
        length valall $100;
        if first.cat then valall = val;
        else valall = compress(valall||"/"||val);
        retain valall;
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ID    CAT    VAL        valall
     1     1     Bonjour    Bonjour
     2     1     Hello      Hello
     2     1     Hi         Hello/Hi
     3     1     Bonjour    Bonjour
     3     1     Hi         Bonjour/Hi
     3     1     Hello      Bonjour/Hi/Hello
     4     1     Bonjour    Bonjour
     4     1     Hello      Bonjour/Hello
     4     2     Hi         Hi
    Cordialement,

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    février 2013
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2013
    Messages : 337
    Points : 229
    Points
    229

    Par défaut

    Bonjour et merci,

    Ça marche parfaitement. Je voudrais bien savoir en quoi la place du RETAIN dans l'étape data compte, car même en le mettant après le SET, mais à pas à la fin, ça ne fonctionne pas. Je me souviens avoir déjà été piégé par quelque chose dans ce genre...

    Avez-vous une idée ?

    Merci encore,

    alers

  4. #4
    Membre confirmé
    Inscrit en
    novembre 2009
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 266
    Points : 546
    Points
    546

    Par défaut [DATA] Concaténer des lignes

    Je voudrais bien savoir en quoi la place du RETAIN dans l'étape data compte, car même en le mettant après le SET, mais à pas à la fin, ça ne fonctionne pas.
    La place du retain n'a pas d'importance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data table_3;
        set table;
        retain valall;
        by ID CAT;
        length valall $100;
        if first.cat then valall = val;
        else valall = compress(valall||"/"||val);
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ID    CAT    VAL        valall
     1     1     Bonjour    Bonjour
     2     1     Hello      Hello
     2     1     Hi         Hello/Hi
     3     1     Bonjour    Bonjour
     3     1     Hi         Bonjour/Hi
     3     1     Hello      Bonjour/Hi/Hello
     4     1     Bonjour    Bonjour
     4     1     Hello      Bonjour/Hello
     4     2     Hi         Hi
    Le problème dans votre code est que vous mélangez l'usage de retain et lag.

    Cordialement,

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    février 2013
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2013
    Messages : 337
    Points : 229
    Points
    229

    Par défaut

    Merci beaucoup, je comprends mieux maintenant.

    Je voudrais poser une autre question car j'ai un nouveau cas qui s'offre à moi si j'ose dire.

    Je voudrais retenir une valeur à un certain moment et dérouler un algorithme à partir de ce moment là. Je place cette question ici car je me dis que cela peut correspondre à du RETAIN également...

    Voici un exemple plus parlant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    data table;
        ID = 1; CATEGORIE_1 = "Y"; CATEGORIE_2 = " "; output;
        ID = 1; CATEGORIE_1 = " "; CATEGORIE_2 = "Y"; output;
        ID = 2; CATEGORIE_1 = " "; CATEGORIE_2 = "Y"; output;
        ID = 2; CATEGORIE_1 = "Y"; CATEGORIE_2 = "Y"; output;
        ID = 2; CATEGORIE_1 = " "; CATEGORIE_2 = "Y"; output;
    run;
    Pour chaque ID, à partir du moment où j'observe CATEGORIE_1 = "Y", je dois :
    - Créer une variable FLAG="Y"
    - Parcourir toutes les lignes suivantes
    - - FLAG="Y" si CATEGORIE_2 = "Y"

    Donc en gros, pour l'ID 1, je dois me retrouver avec FLAG="Y" sur la ligne 1 et également FLAG="Y" sur la ligne 2, car CATEGORIE_2="Y" arrive après CATEGORIE_1="Y".
    Pour l'ID 2, je ne dois rien avoir sur la première ligne, mais FLAG = "Y" partout après.

    J'ai essayer DO UNTIL, sans succès. Et le RETAIN s'applique à tout l'identifiant, pas uniquement à partir de CATEGORIE_1 = "Y".

    Avez-vous une piste ?

    Merci encore,

    alers

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

Discussions similaires

  1. [VxiR2] Concaténé des lignes de tableau en une ligne avec ,
    Par DevFranck dans le forum Webi
    Réponses: 1
    Dernier message: 05/04/2011, 15h53
  2. [Débutant] Concaténer des lignes d'images
    Par TopCao dans le forum MATLAB
    Réponses: 5
    Dernier message: 07/02/2010, 19h58
  3. Concaténation des lignes d'un fichier texte
    Par oranoutan dans le forum C
    Réponses: 9
    Dernier message: 14/07/2008, 19h58
  4. Concaténer des lignes
    Par Wisefool dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 26/02/2008, 16h25
  5. Concaténer des lignes d'enregistrements dans une colonne
    Par dany13 dans le forum MS SQL-Server
    Réponses: 10
    Dernier message: 08/07/2005, 21h56

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