Précédent   Forum du club des développeurs et IT Pro > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 22/02/2013, 09h15   #1
ErwanLegrand
Invité de passage
 
Erwan Legrand
Inscription : juin 2010
Messages : 9
Détails du profil
Informations personnelles :
Nom : Erwan Legrand

Informations forums :
Inscription : juin 2010
Messages : 9
Points : 2
Points : 2
Par défaut Importation fichier texte - OUTPUT Conditionnel

Bonjour,

Je suis en train de réaliser un programme d'importation d'un fichier texte dans différentes tables SAS.

Pour cela, j'utilise les instruction INFILE pour lire le fichier (nom: RSFA) et INPUT pour écrire dans mes tables. La difficulté est la suivante:

Les 8 premiers caractères de chaque ligne correspondent à un identifiant d'établissement de santé. Le 9ème caractère contient une lettre (de A à F) qui va déterminer dans quelle table SAS, la ligne du fichier texte va être copier.

Dans un premier temps, j'ai donc créé la structure de mes tables RSFA_A, RSFA_B ... RSFA_F qui n'ont toutes la même longueur, ni les mêmes variables.

Avant d'utiliser la fonction INPUT afin d'écrire ma ligne dans une table, je cherche donc à récupérer la valeur de la lettre afin de choisir la bonne table pour mon OUTPUT.

J'aimerai donc stocker la valeur de la lettre dans une variable, puis effectuer un test à l'aide d'une instruction SELECT WHEN pour déterminer la suite de mon programme. Seulement je ne sais pas comment stocker cette valeur dans une variable sans l'avoir écrit précédemment dans une table à l'aide d'INPUT.

Je vous remercie pour votre aide.

Cordialement,

Erwan Legrand
ErwanLegrand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 10h21   #2
ibrahima13
Membre régulier
 
Inscription : juillet 2010
Messages : 79
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 79
Points : 82
Points : 82
Bonjour,

Je te propose une solution (il y'a peut être des meilleurs solutions) qui consiste à des étapes DATA pour chacune de tes tables (avec le même fichier entrée). Pour pouvoir détéerminer quelle table écrire il faut bloquer la valeur de la variable code en utilisant le signe @. Après tu supprimes toutes les observations qui ne satisfaisent pas la condition et puis tu écris la ligne d'input

Code :
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
DATA RSF_A;
INPUT  @9 CODE :$1. @;
IF code ne 'A' then DELETE;
input @1 id :$8.  @10 age;
cards;
00000001A 25
00000002B M 75
00000003C TOULOUSE
;
run;
DATA RSF_B;
INPUT  @9 CODE :$1. @;
IF code ne 'B' then DELETE;
input @1 id :$8.  @10 sex :$1. poids;
cards;
00000001A 25
00000002B M 75
00000003C TOULOUSE
;
run;
DATA RSF_C;
INPUT  @9 CODE :$1. @;
IF code ne 'C' then DELETE;
input @1 id :$8. @10 ville :$50.;
cards;
00000001A 25
00000002B M 75
00000003C TOULOUSE
;
run;
Bon courage
ibrahima13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 10h50   #3
jmarandet
Membre du Club
 
Homme julien marandet
Ingénieur Statisticien
Inscription : janvier 2013
Messages : 28
Détails du profil
Informations personnelles :
Nom : Homme julien marandet
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur Statisticien
Secteur : Service public

Informations forums :
Inscription : janvier 2013
Messages : 28
Points : 54
Points : 54
Bonjour Erwan,

La proposition d'ibrahima13 de bloquer le curseur avec '@' est très bonne pour te mettre sur la piste.

Tu peux ainsi regrouper les 3 étapes DATA en une seule :

Par ex :
Citation:
12345678Aclinique TOTO
12345678BCancerologie 2
12345678BRadiothérapie 10
12345678CDr SuperMario 75
87654321ACHU LULU
87654321BDermathologie 20
87654321CDr G Bobo 36
Code :
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
 
filename rfsa "...\RFSA.txt";
 
DATA RFSA_A(keep=idetab typRFSA categ rs)
	RFSA_B(keep=idetab typRFSA unite nb_unit)
	RFSA_C(keep=idetab typRFSA medecin age);
	INFILE rfsa ls=1200;
	input typRFSA $ 9 @;
	putlog typRFSA=;
	IF typRFSA = "A" then do;
		input 
			idetab $ 1-8
			typRFSA $ 9 
			categ $ 10-18
			rs $ 19-22;
		output RFSA_A;
	end;
	IF typRFSA = "B" then do;
		input 
			idetab $ 1-8
			typRFSA $ 9 
			unite $ 10-23 
			nb_unit 24-25;
		output RFSA_B;
	end;
	IF typRFSA = "C" then do;
		input
			idetab $ 1-8
			typRFSA $ 9  @10 
			medecin $ 10-23
			age 24-25;
		output RFSA_C;
	end;
run;
jmarandet est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/02/2013, 16h30   #4
ErwanLegrand
Invité de passage
 
Erwan Legrand
Inscription : juin 2010
Messages : 9
Détails du profil
Informations personnelles :
Nom : Erwan Legrand

Informations forums :
Inscription : juin 2010
Messages : 9
Points : 2
Points : 2
Citation:
Envoyé par ibrahima13 Voir le message
Bonjour,

Je te propose une solution (il y'a peut être des meilleurs solutions) qui consiste à des étapes DATA pour chacune de tes tables (avec le même fichier entrée). Pour pouvoir détéerminer quelle table écrire il faut bloquer la valeur de la variable code en utilisant le signe @. Après tu supprimes toutes les observations qui ne satisfaisent pas la condition et puis tu écris la ligne d'input

Code :
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
DATA RSF_A;
INPUT  @9 CODE :$1. @;
IF code ne 'A' then DELETE;
input @1 id :$8.  @10 age;
cards;
00000001A 25
00000002B M 75
00000003C TOULOUSE
;
run;
DATA RSF_B;
INPUT  @9 CODE :$1. @;
IF code ne 'B' then DELETE;
input @1 id :$8.  @10 sex :$1. poids;
cards;
00000001A 25
00000002B M 75
00000003C TOULOUSE
;
run;
DATA RSF_C;
INPUT  @9 CODE :$1. @;
IF code ne 'C' then DELETE;
input @1 id :$8. @10 ville :$50.;
cards;
00000001A 25
00000002B M 75
00000003C TOULOUSE
;
run;
Bon courage
Stocker la variable dans la log, je n'y avais pas pensé. Mon problème était de savoir ou stocker cette valeur afin de faire un test dessus. J'essaierai donc votre solution, à mon retour de vacances!

Merci beaucoup pour votre réactivité en tout cas.
ErwanLegrand est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


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


 
 
 
 
Partenaires

Hébergement Web