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 :

Transformation d'une base de données


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Homme Profil pro
    phD en génétique animale
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : phD en génétique animale
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 11
    Points
    11
    Par défaut Transformation d'une base de données
    Bonjours,
    est-ce quelqu'un peut m'aider pour trouver une solution à mon problème (un peut compliqué), c'est pour ça, je vais essayer de fournir le plus ample d'informations. veuillez être patient
    en fait j'ai une base de données assez importante (+200 000 obs) de la forme:
    id d_cre n_act d_d_act d_ctr SS MM GG
    01 01/02/08 1 27/08/10 15/09/10 22 3.2 3.1
    01 01/02/08 1 27/08/10 22/10/10 26 3.4 3.3
    01 01/02/08 1 27/08/10 25/11/10 25 3.4 3.1
    01 01/02/08 1 27/08/10 19/12/10 22 3.3 3.1
    01 01/02/08 1 27/08/10 27/01/11 19 3.1 3.0
    01 01/02/08 1 27/08/10 17/02/11 17 3.0 2.9
    01 01/02/08 1 27/08/10 23/03/11 12 3.0 2.9
    01 01/02/08 2 23/02/12 18/03/12 26 3.2 3.4
    01 01/02/08 2 23/02/12 01/04/12 26 3.2 3.2
    01 01/02/08 2 23/02/12 13/05/12 25 3.2 3.0
    01 01/02/08 2 23/02/12 28/06/12 23 3.2 3.1
    01 01/02/08 2 23/02/12 15/08/12 17 3.3 .
    01 01/02/08 2 23/02/12 26/09/12 0 0 0
    02 15/09/07 1 02/12/09 24/12/09 12 3.0 2.9
    02 15/09/07 1 02/12/09 13/02/10 19 3.1 3.0
    02 15/09/07 1 02/12/09 28/03/10 19 . .
    02 15/09/07 1 02/12/09 01/04/10 26 3.2 3.4
    02 15/09/07 1 02/12/09 30/04/10 26 3.2 3.2
    02 15/09/07 1 02/12/09 09/06/10 24 3.2 3.2
    02 15/09/07 1 02/12/09 11/07/10 23 3.0 3.2
    02 15/09/07 1 02/12/09 03/09/10 20 3.2 3.2
    02 15/09/07 3 03/06/13 07/06/13 21 3.3 3.2
    02 15/09/07 3 03/06/13 19/07/13 20 3.2 3.2
    02 15/09/07 3 03/06/13 28/08/13 19 3.1 3.1
    02 15/09/07 3 03/06/13 03/10/13 15 3.2 2.9
    etc...
    id=identifiant
    d_cre=date de création
    n_act=numéro de l'activité
    d_d_act=date de début de l'activité
    d_ctr=date de controle
    SS, MM, GG=des mesures,

    pour chaque id il y a une d_cre qui ne change pas.
    pour chaque id et chaque n_act il y a une d_d_act qui est le même.
    il se peut de deux ou plusieurs d_ctr sont identiques (par coïncidence) pour deux (ou plus) id différents mais pas pour le même n_act.

    en fait mon problème est que à partir de cette base je veux créer plusieurs bases (peut importe le format .txt, .dat ou autre) en fonction du numéro de l'activité (n_act) (ma base comprend 9 n_act différentes donc je vais créer 9 nouvelles bases.
    le nombre de contrôle (je n'est pas cette variable dans ma base) est désigné par le nombre de date de contrôle (d_ctr) varie d'un id à un autre et d'un numéro de contrôle à un autre. ce nombre de contrôles ainsi que les mesures vont indiquer le nombre des colonnes dans les bases qui seront générées

    ces bases seront de la forme:

    base1 (n_act=1):

    id d_cre d_d_act d_ctr1 SS1 MM1 GG1 d_ctr2 SS2 MM2 GG2 ... (la 1ère d_ctr devient d_ctr1 ainsi pour les mesures)
    01
    02

    base2 (n_act=2):

    id d_cre d_d_act d_ctr1 SS1 MM1 GG1 d_ctr2 SS2 MM2 GG2 ...
    01

    base3 (n_act=3):

    id d_cre d_d_act d_ctr1 SS1 MM1 GG1 d_ctr2 SS2 MM2 GG2 ...
    02

    etc...

    je sais que j'ai dit trop de bla bla mais c'est important pour moi. je compte sur votre générosité. merci d'avance. (j'ai oublier de vous dire que j'ai SAS 9.0)

  2. #2
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Je te propose cette solution:

    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
     
    data test;
    input id @4 d_cre ddmmyy8. @13 n_act  @15 d_d_act ddmmyy8. @24 d_ctr ddmmyy8. @33 SS @36 MM  @40 GG ;
    format d_cre d_d_act d_ctr ddmmyy8.  mm 3.1 gg 3.1;
    format id z2.;
    cards;
    01 01/02/08 1 27/08/10 15/09/10 22 3.2 3.1
    01 01/02/08 1 27/08/10 22/10/10 26 3.4 3.3
    01 01/02/08 1 27/08/10 25/11/10 25 3.4 3.1
    01 01/02/08 1 27/08/10 19/12/10 22 3.3 3.1
    01 01/02/08 1 27/08/10 27/01/11 19 3.1 3.0
    01 01/02/08 1 27/08/10 17/02/11 17 3.0 2.9
    01 01/02/08 1 27/08/10 23/03/11 12 3.0 2.9
    01 01/02/08 2 23/02/12 18/03/12 26 3.2 3.4
    01 01/02/08 2 23/02/12 01/04/12 26 3.2 3.2
    01 01/02/08 2 23/02/12 13/05/12 25 3.2 3.0
    01 01/02/08 2 23/02/12 28/06/12 23 3.2 3.1
    01 01/02/08 2 23/02/12 15/08/12 17 3.3 3.1
    01 01/02/08 2 23/02/12 26/09/12 18 3.4 3.1
    02 15/09/07 1 02/12/09 24/12/09 12 3.0 2.9
    02 15/09/07 1 02/12/09 13/02/10 19 3.1 3.0
    02 15/09/07 1 02/12/09 28/03/10 19 3.1 3.0
    02 15/09/07 1 02/12/09 01/04/10 26 3.2 3.4
    02 15/09/07 1 02/12/09 30/04/10 26 3.2 3.2
    02 15/09/07 1 02/12/09 09/06/10 24 3.2 3.2
    02 15/09/07 1 02/12/09 11/07/10 23 3.0 3.2
    02 15/09/07 1 02/12/09 03/09/10 20 3.2 3.2
    02 15/09/07 3 03/06/13 07/06/13 21 3.3 3.2
    02 15/09/07 3 03/06/13 19/07/13 20 3.2 3.2
    02 15/09/07 3 03/06/13 28/08/13 19 3.1 3.1
    02 15/09/07 3 03/06/13 03/10/13 15 3.2 2.9
    ;run;
     
     
     
    %macro test(DATA=,colonne=);
    	proc sort DATA=&DATA(keep=&colonne) out=VALUES nodupkey;
    		BY &colonne;
    	run;
     
    	DATA _null_;
    		SET VALUES end=last;
    		call symputx('monsujet'||LEFT(_n_),&colonne);
    		IF last then call symputx('count',_n_);
    	run;
     
    	DATA 
    		%do i=1 %TO &count;
    			&data._&&monsujet&i
    		%end;
    	;
    		SET &DATA;
     
    		SELECT (&colonne);
    		%do i=1 %TO &count;
    			when ("&&monsujet&i") output &data._&&monsujet&i;
    		%end;
    		otherwise;
    		end;
                 run;
    %mend org;
     
    %test(DATA=test,colonne=n_act);
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    La macro "%dispatcher" ci-dessous devrait répondre à ta question :
    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
    data base ;
    input id d_cre $ n_act d_d_act $ d_ctr $ SS MM GG ;
    cards ;
    01 01/02/08 1 27/08/10 15/09/10 22 3.2 3.1
    01 01/02/08 1 27/08/10 22/10/10 26 3.4 3.3
    01 01/02/08 1 27/08/10 25/11/10 25 3.4 3.1
    01 01/02/08 1 27/08/10 19/12/10 22 3.3 3.1
    01 01/02/08 1 27/08/10 27/01/11 19 3.1 3.0
    01 01/02/08 1 27/08/10 17/02/11 17 3.0 2.9
    01 01/02/08 1 27/08/10 23/03/11 12 3.0 2.9
    01 01/02/08 2 23/02/12 18/03/12 26 3.2 3.4
    01 01/02/08 2 23/02/12 01/04/12 26 3.2 3.2
    01 01/02/08 2 23/02/12 13/05/12 25 3.2 3.0
    01 01/02/08 2 23/02/12 28/06/12 23 3.2 3.1
    01 01/02/08 2 23/02/12 15/08/12 17 3.3 .
    01 01/02/08 2 23/02/12 26/09/12 0 0 0
    02 15/09/07 1 02/12/09 24/12/09 12 3.0 2.9
    02 15/09/07 1 02/12/09 13/02/10 19 3.1 3.0
    02 15/09/07 1 02/12/09 28/03/10 19 . .
    02 15/09/07 1 02/12/09 01/04/10 26 3.2 3.4
    02 15/09/07 1 02/12/09 30/04/10 26 3.2 3.2
    02 15/09/07 1 02/12/09 09/06/10 24 3.2 3.2
    02 15/09/07 1 02/12/09 11/07/10 23 3.0 3.2
    02 15/09/07 1 02/12/09 03/09/10 20 3.2 3.2
    02 15/09/07 3 03/06/13 07/06/13 21 3.3 3.2
    02 15/09/07 3 03/06/13 19/07/13 20 3.2 3.2
    02 15/09/07 3 03/06/13 28/08/13 19 3.1 3.1
    02 15/09/07 3 03/06/13 03/10/13 15 3.2 2.9
    ; 	
     
    %macro dispatcher ;
    data _null_ ;
    set base ;	
    call execute ('data base'||trim(left(n_act))||' ; 
                   set base; 
                   if n_act ='||trim(left(n_act))||'; 	
                   run;') ;  
    run;		
     
    proc sql noprint ;
    select 	distinct n_act, count(distinct n_act) 
    into :listactivs separated by '  ', :nb
    from base ;
    quit ;
     
    %do ii=1 %to &nb ;                
    %let i=%scan(&listactivs., &ii);	
     
    data base&i. ;
     set base&i. ;
     by  id d_cre ;
     if first.id then cnt=0  ; cnt+1 ;
    run;   
     
    proc sql  noprint ;
    create table temp as
    select distinct n_act, cnt from base&i. ;
    quit;  	 
     
    data _null_;
    set temp end=fin ;
    if _n_ eq 1 then call execute('data base_&i ; merge ') ;
                     call execute(catt('base&i. (where=(cnt=', cnt,' and n_act=', n_act,') rename=(d_ctr=d_ctr_', cnt, ' SS=SS_', cnt, ' MM=MM_', cnt, ' GG=GG_', cnt,'))')) ;
     
    if fin then call execute('; by id ; drop n_act cnt ; run; ') ;
    run;
    proc print data=base_&i ; run ;  
    %end ;
    %mend dispatcher ;		%dispatcher ;
    Cordialement Ward

  4. #4
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Une autre solution avec array est également possible:

    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    option symbolgen;
     
    data test;
    input id @4 d_cre ddmmyy8. @13 n_act  @15 d_d_act ddmmyy8. @24 d_ctr ddmmyy8. @33 SS @36 MM  @40 GG ;
    format d_cre d_d_act d_ctr ddmmyy8.  mm 3.1 gg 3.1;
    format id z2.;
    cards;
    01 01/02/08 1 27/08/10 15/09/10 22 3.2 3.1
    01 01/02/08 1 27/08/10 22/10/10 26 3.4 3.3
    01 01/02/08 1 27/08/10 25/11/10 25 3.4 3.1
    01 01/02/08 1 27/08/10 19/12/10 22 3.3 3.1
    01 01/02/08 1 27/08/10 27/01/11 19 3.1 3.0
    01 01/02/08 1 27/08/10 17/02/11 17 3.0 2.9
    01 01/02/08 1 27/08/10 23/03/11 12 3.0 2.9
    01 01/02/08 2 23/02/12 18/03/12 26 3.2 3.4
    01 01/02/08 2 23/02/12 01/04/12 26 3.2 3.2
    01 01/02/08 2 23/02/12 13/05/12 25 3.2 3.0
    01 01/02/08 2 23/02/12 28/06/12 23 3.2 3.1
    01 01/02/08 2 23/02/12 15/08/12 17 3.3 3.1
    01 01/02/08 2 23/02/12 26/09/12 18 3.4 3.1
    02 15/09/07 1 02/12/09 24/12/09 12 3.0 2.9
    02 15/09/07 1 02/12/09 13/02/10 19 3.1 3.0
    02 15/09/07 1 02/12/09 28/03/10 19 3.1 3.0
    02 15/09/07 1 02/12/09 01/04/10 26 3.2 3.4
    02 15/09/07 1 02/12/09 30/04/10 26 3.2 3.2
    02 15/09/07 1 02/12/09 09/06/10 24 3.2 3.2
    02 15/09/07 1 02/12/09 11/07/10 23 3.0 3.2
    02 15/09/07 1 02/12/09 03/09/10 20 3.2 3.2
    02 15/09/07 3 03/06/13 07/06/13 21 3.3 3.2
    02 15/09/07 3 03/06/13 19/07/13 20 3.2 3.2
    02 15/09/07 3 03/06/13 28/08/13 19 3.1 3.1
    02 15/09/07 3 03/06/13 03/10/13 15 3.2 2.9
    ;run;
     
     
    %macro test(DATA=,colonne=);
     
            proc sort DATA=&DATA(keep=&colonne) out=VALUES nodupkey;
    	    BY &colonne;
    	    run;
     
    	    DATA _null_;
    		SET VALUES end=last;
    		call symputx('monsujet'||LEFT(_n_),&colonne);
    		IF last then call symputx('count',_n_);
    	    run;
     
        	DATA 
    		%do i=1 %TO &count;
    			&data._&&monsujet&i
    		%end;
    	    ;
    		SET &DATA;
     
    		SELECT (&colonne);
    		%do i=1 %TO &count;
    			when ("&&monsujet&i") output &data._&&monsujet&i;
    		%end;
    		otherwise;
    		end;
            run;
     
     
    %do i=1 %to &count;
     
      data &data._&&monsujet&i;
      set &data._&&monsujet&i;
      by id;
      if first.id then temp=0;
      temp+1;
      run;
     
     PROC SQL NOPRINT;
     SELECT left(put(max(temp),3.))INTO :cnt
     FROM &data._&&monsujet&i 
     ;
     QUIT;
     
     DATA &data._&&monsujet&i;
     format d_cre1-d_cre&cnt  ddmmyy8.;
     format d_d_act1-d_d_act&cnt  ddmmyy8.;
     format d_ctr1-d_ctr&cnt  ddmmyy8.; 
     
     ARRAY TMP_d_cre(&cnt)   d_cre1-d_cre&cnt ;
     ARRAY TMP_n_act(&cnt)   n_act1-n_act&cnt;
     ARRAY TMP_d_d_act(&cnt) d_d_act1-d_d_act&cnt;
     ARRAY TMP_d_ctr(&cnt)   d_ctr1-d_ctr&cnt;
     ARRAY TMP_ss(&cnt)      ss1-ss&cnt;
     ARRAY TMP_mm(&cnt)      mm1-mm&cnt;
     ARRAY TMP_gg(&cnt)      gg1-gg&cnt;
     drop d_cre n_act d_d_act d_ctr ss mm gg temp;
      DO UNTIL (LAST.id);
      SET &data._&&monsujet&i;
     
     BY id;
     TMP_d_cre(temp)=d_cre;
     TMP_n_act(temp)=n_act;
     TMP_d_d_act(temp)=d_d_act;
     TMP_d_ctr(temp)=d_ctr;
     TMP_ss(temp)=ss;
     TMP_mm(temp)=mm;
     TMP_gg(temp)=gg;
     
     END;
     RUN;
     
     proc contents data=&data._&&monsujet&i out=temp (keep=name); 
     run;
     
     data temp;
     set temp;
     name1=input(left(compress(name,'_','A')),3.);
     run; 
     
     proc sort data=temp;by name1; run;
     
     proc sql noprint;
      select name into : var_lst separated by ','
         from temp
         	   ;
     
     create table &data._&&monsujet&i as
         select id, &var_lst.
         from &data._&&monsujet&i
     
    	 ;
     quit;
     
     
    %end;
     
    %mend;
     
    %test(DATA=test,colonne=n_act);
     
    proc datasets lib=work; 
    delete temp values;
    quit;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  5. #5
    Membre à l'essai
    Homme Profil pro
    phD en génétique animale
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : phD en génétique animale
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 11
    Points
    11
    Par défaut transformation d'une base de donnnées
    je vous remercie énormément pour l’intérêt que vous avez porter à ma demande, mais en essayant le code que vous m'avez proposer, les résultats générées ne répondent pas à mes attentes.
    en fait ce que j'attends c'est avoir des résultats de cette forme:

    base_i (concerne les données avec n_act=i) (i=1,2,....n)

    id d_cre n_act d_d_act_1 m1_1 m1_2 m1_3 d_d_act_2 m1_2 m1_2 m1_3 ...... (autant de d_d_act qui peuvent exister, variables d'un individu à un autre) et le id figure une et seule fois.



    cordialement

  6. #6
    Membre à l'essai
    Homme Profil pro
    phD en génétique animale
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : phD en génétique animale
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 11
    Points
    11
    Par défaut transformation d'une base de données
    Bonjour,

    j'aimerais vous remercier vous hossward et m. Brahim de m'avoir aider pour résoudre mon problème
    Le macro %dispatcher% que vous m'aviez proposer a bien donné des résultats comme voulu, je l'ai essayer avec 100 obs. et c'est bien
    je l'ai adapté à ma base (~570 000 obs)............ oops ça fait maintenant 16 heures que le système tourne et j'ai pas encore les résultats.
    je vais encore attendre (puisque j'ai pas de choix) mais je vous remercie comme-même énormément.


    cordialement,

  7. #7
    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
    ouille les %DO I=1 %TO &NB.. forcément sur 500 000 observations et des brouettes ça coince

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    Pour avoir les variables dans l’ordre souhaité, il faudrait ajouter la partie en couleur dans le code.

    L’intérêt de la proposition précédente (Best Seller : Le hash pour éclater une table SAS en sous tables) est incontestable mais le 1er call execute de mon code fait exactement le même travail et est bien placé pour répondre à votre problème traité avec version 9.0 de SAS d’une part et d’autre part on n’a pas besoin de trier la base. On peut même mettre le call execute à l’extérieur de la macro pour éclater la table SAS puis exécuter la macro. D’ailleurs la proposition HASH ne fait pas la transposée des variables, d_ctr, SS, MM et GG par identifiant pour chaque sous-table. Cette transposée n’est pas facile à faire avec le HASH.
    Pourriez-vous nous communiquer le temps pris par l’exécution du programme.
    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
    %macro dispatcher ;
    data _null_ ;
    set base ;	
    call execute ('data base'||trim(left(n_act))||'  ; 
                   set base; 
                   if n_act ='||trim(left(n_act))||'; 	
                   run;') ;  
    run;		
    
    proc sql noprint ;
    select 	distinct n_act, count(distinct n_act) 
    into :listactivs separated by '  ', :nb
    from base ;
    quit ;
    
    %do ii=1 %to &nb ;                
    %let i=%scan(&listactivs., &ii) ;	
    
    data base&i. ;
     set base&i. ;
     by  id d_cre ;
     if first.id then cnt=0  ; cnt+1 ;
    run;   
    
    proc sql  noprint ;
    create table temp as
    select distinct n_act, cnt from base&i. ;
    quit;  	 
    
    data _null_;
    set temp end=fin ;
    if _n_ eq 1 then call execute('data base_&i ; merge ') ;
                     call execute(catt('base&i. (where=(cnt=', cnt,' and n_act=', n_act,') rename=(d_ctr=d_ctr_', cnt, ' SS=SS_', cnt, ' MM=MM_', cnt, ' GG=GG_', cnt,'))')) ;
    
    if fin then call execute('; by id ; drop n_act cnt ; run; ') ;
    run;
    /*----- Mettre la liste des variables dans l'ordre souhaité -----*/
    data base_&i. ;
    retain id d_cre d_d_act  d_ctr_1 SS_1 MM_1 GG_1 d_ctr_2 SS_2 MM_2 GG_2 
                             d_ctr_3 SS_3 MM_3 GG_3 d_ctr_4 SS_4 MM_4 GG_4 
                             d_ctr_5 SS_5 MM_5 GG_5 d_ctr_6 SS_6 MM_6 GG_6
    	                 d_ctr_7 SS_7 MM_7 GG_7 d_ctr_8 SS_8 MM_8 GG_8 ;
    set base_&i. ;
    run ;  	 proc print data=base_&i. ; run ;  
    %end ;
    %mend dispatcher ;		%dispatcher ;
    J’envisage d’autres alternatives techniques afin d’optimiser le temps d’exécution.

    Cordialement Ward

  9. #9
    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
    Une proc sort peut souvent être un moindre mal, il y a vraiment que sur les fichiers gigantesques qu'elle peut poser problème.

    Je ne sais pas si soumri a eu ses résultats...

    Hossward, dans ton code, c'est surtout le début qui me fait tiquer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    data _null_ ;
    set base ;	
    call execute ('data base'||trim(left(n_act))||'  ; 
                   set base; 
                   if n_act ='||trim(left(n_act))||'; 	
                   run;') ;  
    run;
    Si je lis bien, tu fais une call execute pour chaque observation... (avec 500 000 ça fait un peu beaucoup) surtout qu'à priori on la refait de nombreuses fois inutilement et donc au final 500 000 x 500 000 ... me semble un peu indigeste en temps de traitement pour la machine standard du chargé d'études.

    En SAS 9.0, j'ai relu la DOC les tableaux associatifs sont bien implémentés (juste le multidata qui ne l'est pas), mais donc quand même à confirmer par Soumri si ça marche.
    Sinon il faudra faire un test sous une autre forme (par exemple vérifier de créer un fichier uniquement si il n'existe pas, sinon ne pas re-créer ce qui existe déjà).
    Ou en l'occurence une simple "proc nodupkey by n_act" sur le fichier en SET de ta première étape DATA _NULL_

    Je te propose une légère modification de la toute première partie de ton code, en utilisant un tableau associatif de sorte à vérifier que la valeur de n_act courante n'a pas été traitée et de sorte à uniquement faire les traitement utiles.

    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
    data _null_ ;
    set base ;	
    IF _N_=1 THEN 	DO;
    				DECLARE HASH Controle();
    				Controle.DefineKey('n_act');
    				Controle.DefineData('n_act');
    				Controle.DefineDone();
    				END;
    RC=Controle.Check();
    IF RC^=0 THEN 	DO;
    				RC=Controle.ADD();
    				call execute (	'data base'||trim(left(n_act))||'  ; 
                  					set base; 
               						if n_act ='||trim(left(n_act))||'; 	
                   					run;') ; 
    				END; 
    run;

  10. #10
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    jerome_pdv2, Oui tu as raison ça fait un peu Trop.
    Je pense qu’on peut également remédier ce problème avec le moindre mal « proc sort » en proposant ceci à Soumri:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    proc sort data=base ; by n_act id ; run ;
    data _null_ ;
    set base ;
        by n_act ;
        if first.n_act then do ;
        call execute('data base'||trim(left(n_act))||'; 
                      set base(where=(n_act='||n_act||')) ; run; ');
        end ;
    run;
    Dans ce cas là, on fait la call execute une fois pour chaque groupe de modalité de la variable n_act.

  11. #11
    Membre à l'essai
    Homme Profil pro
    phD en génétique animale
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : phD en génétique animale
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 11
    Points
    11
    Par défaut concernant le temps de transformation de la base
    bonjour,
    trop chanceux d'être entourer par des gens comme vous, je remercie tous ceux qui participent à cette discussion.
    pour le temps nécessaire à la transformation de la base j'avais pas trop de chance pour l'avoir; une coupure de tension et tout doit redémarrer de nouveaux, j’avoue j'ai pas un poste costaux (dualcore : intel pentium T4200, 2.0 GHz, 800 MHz FSB) mais j'ai remarqué que le traitement d'une seule observation ça prend au moyenne ~0.12s (donc le temps disant nécessaire pour traiter toute la base de 570 000 obs. est de ~19 heures) je vais essayer les transformations suggérées et je vous mettrais au courant.

    cordialement

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/07/2009, 09h31
  2. transforme une base de données Access en un fichier xml
    Par canada_bea dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 14/06/2009, 15h47
  3. Transformer une base de données Mysql en XML
    Par jrlulu dans le forum Outils
    Réponses: 5
    Dernier message: 12/12/2008, 19h23
  4. transformation d'une base de donnée vers SQL serveur
    Par kfmystik dans le forum Outils
    Réponses: 1
    Dernier message: 22/07/2008, 10h32
  5. transformation d une base de données en model UML
    Par kabacheo dans le forum Autres
    Réponses: 0
    Dernier message: 16/04/2008, 16h58

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