|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Inscription : juillet 2008 Messages : 58 ![]() |
Bonjour.
Voila mon problème: ma table contient plusieurs variables dont celle qui nous interesse ici "sdeliverycode". exemple de sdeliverycode: abc-de-27042010-azert abc-de-27032010-azert abc-de-27022010-qsdfg ...... je souhaite crée une table pour chaque "groupe" (ici premier groupe "azert" deuxieme "qsdfg" Pour cela, j'utilise un substr: Code :
En gros il faudrait dire que si label est different de label-1, alors on créer un nouveau groupe/une nouvelle table, etc... je sais pas si j'ai été assez claire merci de votre aide! |
||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Biostatisticien Inscription : juin 2009 Messages : 1 143 ![]() |
Voici un moyen de sélectionner les différents valeurs prises par ta sous-chaine de caractère.
Code :
Quel est le but de la boucle? |
||
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : juillet 2008 Messages : 58 ![]() |
merci de ton aide.
Le but est d'avoir une table par sdeliverycode semblables (même fin de code). Pour revenir a mon exemple il faudrait une table contenant: abc-de-27042010-azert abc-de-27032010-azert une autre contenant: abc-de-27022010-qsdfg La table à partir de laquelle je travaille est évolutive donc si de nouveaux individus sont ajoutés il faut que de nouvelles tables soient créées à chaque fois (pour les groupes qui n'existent pas déjà), par exemple: abc-de-07112010-yuiop Y a-t-il possibilité de faire cela? |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Biostatisticien Inscription : juin 2009 Messages : 1 143 ![]() |
Oui, c'est possible. Lorsque tu as une mise à jour, les données sont elles ajoutées à la table contenant déjà les informations ou s'agit-il d'une nouvelle table?
|
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Inscription : juillet 2008 Messages : 58 ![]() |
Lors d'une mise à jour, les données sont ajoutées à la table contenant déjà les informations !
|
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Bonjour Ludo.
Il y a deux solutions (au minimum) : soit avec du langage macro (récupérer les valeurs distinctes comme propose Manoutz + les mettre en macro-variables avec CALL SYMPUT + boucle macro pour générer toutes les tables), soit avec un hash table, ce qui suppose une programmation incompréhensible comme ci-dessous. Code :
Bon courage. Olivier |
||
|
|
10
|
|
|
#7 | ||
|
Membre Expert
![]() Biostatisticien Inscription : juin 2009 Messages : 1 143 ![]() |
La version "classique":
Code :
Tu peux expliquer le principe Olivier? |
||
|
|
10
|
|
|
#8 | ||
![]() ![]() Samir SELMANEConsultant en Business Intelligence Inscription : février 2011 Messages : 1 006 ![]() |
je ne sais pas si t'es familiarisé avec la technique de hachage:
Code :
|
||
|
|
00
|
|
|
#9 |
![]() ![]() Samir SELMANEConsultant en Business Intelligence Inscription : février 2011 Messages : 1 006 ![]() |
Ops!! Olivier a déjà répondu.
|
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Biostatisticien Inscription : juin 2009 Messages : 1 143 ![]() |
Alors, qui se lance dans une petite explication du hash?
|
|
|
00
|
|
|
#11 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Allez, je m'y colle : le principe de la table "de hachage" (hash table, la traduction est de toute façon difficile) est de charger des données en mémoire vive (toute une série d'observations à la fois) de manière à pouvoir se balader dedans de manière instantanée ou presque. On évite avec cet objet la lecture séquentielle d'un SET.
Ca rejoint l'idée de lire une table indexée (SET KEY) d'autant que l'objet hash doit avoir une clé d'accès (l'équivalent de la variable indexée : SAS sait où trouver chaque valeur de cette clé). Par rapport à un SET KEY, l'avantage est qu'on peut appliquer à cet objet la méthode OUTPUT dont l'argument (le nom d'une table SAS dans laquelle on déverse tout le contenu de la table de hachage) peut être calculé sur le vif. On peut donc piloter le nom de la table créée en fonction des valeurs d'une variable en les découvrant au fur et à mesure. A ce concept un peu spécial de table de hachage s'ajoute la boucle autour du SET, qui n'est qu'une autre manière d'écrire une lecture par blocs. Voici la version plus classique où on voit mieux les initialisations, les ajouts au hash et l'écriture dans la table en sortie. Code :
|
||
|
|
20
|
|
|
#12 | ||
![]() ![]() Samir SELMANEConsultant en Business Intelligence Inscription : février 2011 Messages : 1 006 ![]() |
Manoutz, le fonctionnement a le même principe que les array ( tableux ou victeurs), c'est de travailler en memoire.
Je te laisse jeter un coup d'oeil sur les liens suivant: French : http://www.monsug.ca/event12/Hash%20object.pdf English: http://support.sas.com/rnd/base/data...-tip-sheet.pdf http://analytics.ncsu.edu/sesug/2006/SC19_06.PDF http://www.sas.com/offices/NA/canada...s_Function.pdf http://www2.sas.com/proceedings/sugi30/236-30.pdf et si vous permettez, j'ajoutes cette sollution, assez simple mais qui permet d'éviter le problème de longueur de macro variable récupérer avec l'INTO de la proc sql; je suppose ici que ludo35 Code :
|
||
|
|
20
|
|
|
#13 | ||||
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Bonjour,
Je te propose une autre approche avec des macros Code :
Code :
|
||||
|
|
00
|
|
|
#14 | ||||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Juste une variante des solutions de SAM et Brice : comme dans le programme de Manoutz, on ne lit qu'une fois la table d'origine pour créer les X nouvelles tables. Il faut déjà la lire une fois pour récupérer les valeurs distinctes, alors si elle est de grande taille, autant éviter de repasser dedans en permanence.
Ici, on tire parti d'un tri préalable des valeurs par fréquence décroissante pour optimiser les conditions de ventilation des observations dans les nouvelles tables avec un SELECT WHEN. Dernière chose : dans le cas de Ludo, la variable à tester est de type caractère, mais ici on prévoit aussi le cas d'une variable numérique, histoire d'avoir un code robuste. Code :
Code :
|
||||
|
|
10
|
|
|
#15 |
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Trop compliqué pour moi,
|
|
|
00
|
|
|
#16 |
|
Invité régulier
![]() Inscription : juillet 2008 Messages : 58 ![]() |
Merci à tous pour vos solutions.
J'ai utilisé la méthode proposée par Manoutz et ça marche. Cependant, je suis maintenant confronté à un autre problème: Les tables créées se nomment par exemple "azert" ou "qsdfg" (cf exemple premier post). Ce que je voudrais maintenant, c'est qu'elles se nomment par exemple "abcazert", "defgsdfg", ... en fonction d'une variable "catégorie" de la même table d'origine contenant : abc def (on ne trouvera pas de "abcgsdfg" par exemple, chaque catégorie contient des codes différents) La variable "catégorie" contient quatre modalités: abc def ghi jkl |
|
|
00
|
|
|
#17 | ||
|
Membre Expert
![]() Biostatisticien Inscription : juin 2009 Messages : 1 143 ![]() |
J'en déduit qu'a chaque code correspond une unique variable "catégorie".
remplace tout simplement substr(sdeliverycode,17,5) par substr(sdeliverycode,1,3)||substr(sdeliverycode,17,5) Code :
|
||
|
|
00
|
|
|
#18 | ||
|
Invité régulier
![]() Inscription : juillet 2008 Messages : 58 ![]() |
parfait , ça fonctionne
![]() derniere étape, maintenant que j'ai toutes mes tables bien comme il faut: les tables contiennent des colonnes de chiffres sur lesquelles je veux ajouter la somme en dernière ligne, pour cela je passe par une proc sql: Code :
|
||
|
|
00
|
|
|
#19 |
|
Membre Expert
![]() Biostatisticien Inscription : juin 2009 Messages : 1 143 ![]() |
pourquoi pas proc univariate ou proc means?
|
|
|
00
|
|
|
#20 |
|
Invité régulier
![]() Inscription : juillet 2008 Messages : 58 ![]() |
parce que j'ai des variables caractères à garder...mais peut-être que c'est quand même possible avec proc means ou proc univariate ?
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com