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

  1. #1
    Membre du Club
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    décembre 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2014
    Messages : 74
    Points : 66
    Points
    66
    Par défaut Expliquer le code de la Transformation des colonnes caractère en numerique
    Bonjour,
    J'ai récupéré ce code sur ce site et il marche très bien .
    je veux comprendre comment il marche, j'ai essayé mais c'est un peu complexe pour moi.

    Ya t-il quelqu'un pour m'aider à le comprendre ?


    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
    %MACRO TO_CHAR;
     PROC SQL NOPRINT ;
                SELECT NAME, '_'!!NAME ,MAX (MONOTONIC()) INTO: OLD_VAR SEPARATED BY ',',: NEW_VAR SEPARATED BY ','  ,: NBR 
                FROM DICTIONARY.COLUMNS WHERE UPCASE (LIBNAME)='WORK' AND UPCASE (MEMNAME)='ma_table' AND UPCASE (TYPE)='NUM';
    QUIT;
     
    data table_sortie ( drop  =  %do i=1 %to &nbr. ; %scan("&new_var",&i,",") %end;);
    SET ma_table (  RENAME=( %DO I=1 %TO &NBR. ; %SCAN("&OLD_VAR",&I,",")=%SCAN("&NEW_VAR",&I,",") %END; )  );
     
                %DO I=1 %TO &NBR.;
                      %SCAN("&OLD_VAR",&I,",")=PUT(%scan("&NEW_VAR",&I,","), BEST.);
     
                %END;			 
    RUN;
    %MEND;
    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    février 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 134
    Points : 119
    Points
    119
    Par défaut
    Bonjour,
    tout d'abord, cette macro ne transforme pas des variables caractères en numériques, mais l'inverse
    (je reproduis le code ci-dessous avec une indentation facilitant la lecture, et, donc, la compréhension)
    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
     
    %MACRO TO_CHAR;
         PROC SQL  ;
    	SELECT NAME, 
    		'_'!! NAME ,
    	        MAX (MONOTONIC()) 
     
    		INTO: OLD_VAR SEPARATED BY ',',
    		   : NEW_VAR SEPARATED BY ','  ,
    		   : NBR 
     
    	            FROM DICTIONARY.COLUMNS WHERE UPCASE (LIBNAME)='WORK' AND UPCASE (MEMNAME)='ma_table' AND UPCASE (TYPE)='NUM';
    	QUIT;
     
    	data table_sortie ( drop  =  %do i=1 %to &nbr. ; %scan("&new_var",&i,",") %end;);
    	set ma_table (  RENAME=( %DO I=1 %TO &NBR. ; %SCAN("&OLD_VAR",&I,",")=%SCAN("&NEW_VAR",&I,",") %END; )  ); 
                %DO I=1 %TO &NBR.;
                      %SCAN("&OLD_VAR",&I,",")=PUT(%scan("&NEW_VAR",&I,","), BEST.); 
                %END;			 
    	run;;
    %MEND;
    La première partie (PROC SQL) utilise la table DICTIONARY.COLUMNS qui contient la liste des variables numériques de la table 'ma_table' . Les trois lignes du "SELECT" ont pour objectif de créer 3 macro-variables :
    - macro-variable OLD_VAR qui correspond à la liste des (noms de) variables numériques de 'ma_table' (macro-variable créée à partir de la variable SAS NAME de la table DICTIONARY.COLUMNS)
    - macro-variable NEW_VAR qui correspond à la liste des (noms de) variables numériques de 'ma_table' préfixés par "_"
    - macro-variable NBR qui correspond au nombre de variables numériques de 'ma_table' (qu'on obtient en calculant le numéro de ligne max de la table DICTIONARY.COLUMNS)

    Dans l'étape DATA qui suit, on renomme, dans la table 'ma_table', les variables numériques (une par une) : les "old_var" sont renommées en "new_var". Par exemple, si la table contient la variable numérique "numero", elle sera renommée en "_numero".

    Puis chaque variable numérique est convertie en caractères. Par exemple, pour la variable "numero", le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %SCAN("&OLD_VAR",&I,",")=PUT(%scan("&NEW_VAR",&I,","), BEST.);
    sera interprété par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numero=PUT(_numero, BEST.);
    Enfin, la partie "drop" permet de supprimer, une par une, les variables de la liste "new_var" (ainsi, la variable "_numero", dont on n'a plus besoin, sera supprimée)

  3. #3
    Membre du Club
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    décembre 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2014
    Messages : 74
    Points : 66
    Points
    66
    Par défaut
    Merci bq c'est très clair

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

Discussions similaires

  1. transformer des colonnes en ligne
    Par noolog dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 21/02/2013, 11h19
  2. Transformer des colonnes en lignes
    Par Heisenberg59 dans le forum Débutez
    Réponses: 4
    Dernier message: 01/10/2012, 18h03
  3. Transformer des colonnes en plusieurs lignes
    Par boubadia dans le forum Autres
    Réponses: 2
    Dernier message: 29/06/2012, 12h39
  4. Transformer des colonnes en lignes
    Par marman dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/11/2006, 17h43
  5. transformer des colonnes en lignes
    Par flonardi dans le forum Oracle
    Réponses: 13
    Dernier message: 28/10/2004, 12h43

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