Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/10/2011, 13h29   #1
Invité de passage
 
Homme
analyste de données
Inscription : octobre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : analyste de données
Secteur : Santé

Informations forums :
Inscription : octobre 2011
Messages : 3
Points : 0
Points : 0
Par défaut Extraction de chaine

bonjour,

je dispose d'un fichier txt sur lequel est enregistré, sur une même ligne des variables les unes à la suite des autres.

Mon souci est que la position de certaines variables est variable
Je m'explique:

Il y a trois types d'infos: le nombre d'unités médicale par lesquelles est passé la personne, le nombre de diag associés, le nombre d'actes.
exemple
si un patient est passé par 3 unités medicale, lors de son passage dans la premiere il y a eu 1 diag, 2 actes, dans la deuxieme, 1 diag et 1 acte et dans la troisieme 2 diag et 2 actes, les données seront saisies comme suit:
unité 1 - unite 2 - unite 3 - diag 1 de l'unite 1 - diag 1 de l'unite 2 - diag 1 de l'unite 3 - diag 2 de l'unite 3 - acte 1 de l'unite 1 - acte 2 de l'unite 1 etc

Pour extraire par exemple les actes (a la fin de la ligne) il faut donc trouver la position de départ qui change en fonction du nombre d'unites et d'actes
j'ai tenté une macro du style
Code :
1
2
3
4
%let i = nbrumb;
%let j = nbdasb;
%let k = nbab;
DATA "g:\sas\rum"; SET "g:\sas\rum"; nba = substr(quit, 222 + &i*40 + &j*6, &k*22); run;
Mais il semblerait que la fonction substr ne prenne pas en considération des paramètres variables

comment faire ?

je vous remercie par avance de vos conseils

Arnaud
youdee est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 16h39   #2
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
Quelle est l'erreur ?
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 16h51   #3
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 012
Points : 1 713
Points : 1 713
les noms des tables "g:\sas\rum";!!!!!
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 17h15   #4
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 828
Points : 2 828
Si je comprends bien ce code (il est vrai assez déroutant avec des chemins entre guillemets en guise de noms de table) il y a eu à un moment une organisation en colonne. D'où le SUBSTR pour aller capturer le morceau qui va bien.
Une étape DATA avec INFILE et INPUT orné de @ pour indiquer les numéros de colonnes, ou à la rigueur de + pour décaler le pointeur de lecture, serait sûrement un moyen plus simple (et sans macros) d'arriver à tes fins.
Bon courage.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2011, 08h50   #5
Invité de passage
 
Homme
analyste de données
Inscription : octobre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : analyste de données
Secteur : Santé

Informations forums :
Inscription : octobre 2011
Messages : 3
Points : 0
Points : 0
tout d'abord merci à tous pour votre participation

le message d'erreur est le suivant:
Code :
NOTE: Troisième argument non valide pour la fonction SUBSTR dans ligne 7 colonne 44.
NB1: l'erreur concerne aussi le deuxième argument (la position du curseur)

D'après ce que j'ai pu trouver comme infos il semblerait que ce message indique que la position et la longueur de la chaine que je souhaite extraire dépasse la longueur réelle de la variable. D'ou l'impossibilité technique de repondre à ma commande.

La difficulte vient de ce que la position de départ de la chaine que je souhaite récupérer est variable. Je ne peux donc pas l'écrire avec une valeur fixe.

De plus, les manuel d'utilisation de la fonction substr n’évoquent jamais la possibilité dans les paramètres de position et de longueur de chaine à prendre, de mettre une variable. Les exemples mettent tous des valeurs numeriques. Je ne sais donc pas si la fonction substr est la meilleure pour résoudre mon problème.

Pour répondre à olivier.decourt il n'y a pas de colonne, c'est la tout le probleme. Les données sont saisies les unes à la suites des autres dans le fichier d'origine, c'est lors de l'import justement que ej dois creer les colonnes mais sachant que la position des variables que je souhaite recuperer ne sont pas fixes mais dependantes d'autres infos dans le fichier (que je peux récupérer elles sans souci).

PS les guillemets sont necessaires pour travailler directement dans un répertoire qui n'est pas celui de travail par défaut

merci a tous
youdee est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2011, 12h36   #6
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 957
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 957
Points : 1 368
Points : 1 368
Bonjour,
A mon avis il te manque %eval, exemple:
Code :
n=substr(quit,%eval(&n+1),%eval(&a-1))
Sinon tes macros-variables seront interprétées comme des chaines de caractère
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2011, 12h50   #7
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 828
Points : 2 828
Citation:
Envoyé par MEGAMIND2 Voir le message
Bonjour,
A mon avis il te manque %eval, exemple:
Code :
n=substr(quit,%eval(&n+1),%eval(&a-1))
Sinon tes macros-variables seront interprétées comme des chaines de caractère
Euh... par forcément, Brice. Le %EVAL serait indispensable si on était en dehors de tout code SAS, dans du pur langage macro. Ici, c'est SAS qui va se charger des additions (avec %EVAL ce sera le compilateur macro, pour un résultat identique).

Plus globalement Youdee, on peut parfaitement utiliser des variables SAS comme arguments de la fonction SUBSTR. Pas forcément des macro-variables, des vraies variables fonctionnent aussi.
Quant à tes chemins entre guillemets, ils pourraient être centralisés sous forme d'une bibliothèque (instruction LIBNAME) qui indiquerait dans quel répertoire tu souhaites lire et écrire des données SAS. C'est plus courant que ton écriture avec des noms physiques, très rares en SAS sauf pour les fichiers à importer et exporter.

Dernière chose : ta description ressemble à des données PMSI. C'est la seule forme sous laquelle tu les as ? Parce que dans la base PMSI les données sont plutôt sous la forme 1 ligne par diag, et pas tout à la suite sur 1 ligne par patient.

Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 14h27   #8
Invité de passage
 
Homme
analyste de données
Inscription : octobre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : analyste de données
Secteur : Santé

Informations forums :
Inscription : octobre 2011
Messages : 3
Points : 0
Points : 0
Salut,

ce sont effectivement les données du PMSI.
Le format que j'ai est celui qui est transmis aux établissements par le bias de l'ATIH. Les formats du type 1 ligne par Diag ont déjà été transformés. Retrouver un fichier de ce type est justement ce que je cherche à faire.

Pour ce qui est de la fonction substr en fait oui les variables fonctionnent très bien.
J'étais persuadé d'avoir déjà essayé c'est pourquoi je m'embarquais dans des choses compliquées. En re tantant suite aux conseils de olivier.decourt cela semble fonctionner.
(Pour autant mon souci n'est pas résolu car je bataille avec le format de ce fichier texte qui décidément est mal adapté à des manipulations de ce genre).
J'ai cependant un début de réponse

Merci à tous et bonne continuation

Arnaud
youdee est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h07.


 
 
 
 
Partenaires

Hébergement Web