Salut à tous,
J'ai un fichier txt qui contient des données pas vraiment propres : il y a une variable "pack" qui parfois n'est pas remplie. Mais là où c'est pire que pas remplie, c'est qu'il n'y a pas les delimiters pour indiquer que la valeur de la variable est vide. On a par exemple (si mes delimiters sont des "|") :
var 1 | var 2 | var 3
mod1 | mod2 | mod3
mod1 |mod3
mod1 | mod2 |mod3
Ainsi, lorsque j'importe dans SAS, j'ai parfois la valeur d'une modalité de la variable 3 qui se trouve dans la colonne de la variable 2 (et tout est décalé pour les autres colonnes). Après recherches (et aide d'un d'entre vous dans un précédent post pour un souci différent mais astuce retenue!), j'arrive à ce niveau de code :
L'idée que je cherche à mettre en oeuvre, c'est mettre le contenu de la variable pack dans _INFILE_, la tester et si elle a une certaine forme je reconnais qu'il s'agit en réalité de la variable d'après Code1 => j'essaie de dire à SAS de sauter cette variable dans l'import.
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 DATA WORK.test; %let _EFIERR_ = 0; INFILE "C:\...\Ptest.txt" delimiter=' ' MISSOVER DSD lrecl=32767 firstobs=2 ; input pack $ @; if ((anydigit(substr(_INFILE_,1,1))>0 and anydigit(substr(_INFILE_,2,1))>0 and (anydigit(substr(_INFILE_,3,1))>0 or substr(_INFILE_,3,1)="-") and anydigit(substr(_INFILE_,4,1))>0) or _INFILE_="UNSPECIFIED") then do; INPUT Sequence : $5. Code1 : $15. Country : $50. Code2 : $15. unite : $5. LIBELLE : $15. valeur : COMMAX22.2 ; end; else do; INPUT Sequence : $5. pack : $120. Code1 : $15. Country : $50. Code2 : $15. unite : $5. LIBELLE : $15. valeur : COMMAX22.2 ; end; FORMAT Sequence : $5. pack : $120. Code1 : $15. Country : $50. Code2 : $15. unite : $5. LIBELLE : $15. valeur : COMMAX22.2 ; INFORMAT Sequence : $5. pack : $120. Code1 : $15. Country : $50. Code2 : $15. unite : $5. LIBELLE : $15. valeur BEST12. ; if _ERROR_ then call symputx('_EFIERR_',1); RUN;
Je joins un petit fichier txt avec un exemple de mon souci.
J'espère avoir réussi à bien expliquer le problème que je rencontre...
Ha oui, ce que j'ai fait ne fonctionne pas du tout. Il y a quelque chose que je n'ai pas compris dans le fonctionnement des input je pense. Si je fais un put _INFILE_, j'obtiens bien le contenu de la variable pack. Par contre c'est après que ça pêche...
Merci beaucoup d'avance pour votre aide !
Ptest.txt
Partager