Attention : Ce code nécessite des droits administrateur.
Le script procède en plusieurs étapes. Il commence par vérifier l'existence d'un fileref ('curdirfl') qui n'est pas encore assigné. Ensuite, il assigne un chemin de fichier ('c:\tmp333') à ce fileref. Il vérifie à nouveau l'existence du fileref, puis l'existence du fichier physique auquel le fileref pointe. Le script décide d'ouvrir le fichier en mode écriture ('o') s'il n'existe pas, ou en mode lecture ('i') s'il existe déjà. Après l'ouverture, il récupère et affiche diverses informations sur le fichier via les fonctions `foptnum`, `foptname` et `finfo`. Enfin, il ferme le fichier et supprime le fileref.
Analyse des données
Type : CREATION_INTERNE
Le script ne dépend pas de données externes préexistantes. Il manipule un fichier nommé 'c:\tmp333' qu'il tente de créer ou d'ouvrir. Toutes les données traitées (existence de fileref/fichier, informations sur le fichier) sont générées ou récupérées en interne par les fonctions SAS.
1 Bloc de code
DATA STEP Data
Explication : Ce bloc `DATA` utilise plusieurs fonctions SAS de manipulation de fichiers:
- `fexist('fileref')` : Vérifie si un fileref est assigné. Retourne 0 si non, 1 si oui.
- `filename('fileref', 'chemin')` : Assigne un chemin physique à un fileref. Retourne 0 si succès.
- `fileref('fileref')` : Vérifie l'état d'un fileref et du fichier qu'il pointe. Une valeur négative indique que le fileref existe mais pas le fichier; zéro indique que les deux existent.
- `fileexist('chemin')` : Vérifie l'existence d'un fichier physique. Retourne 1 si oui, 0 si non.
- `fopen('fileref', 'mode')` : Ouvre le fichier associé au fileref dans un mode spécifié ('i' pour input, 'o' pour output). Retourne un identifiant de fichier (FID) non nul si succès.
- `foptnum(fid)` : Retourne le nombre d'options d'information disponibles pour un fichier ouvert.
- `foptname(fid, index)` : Retourne le nom d'une option d'information spécifique par son index.
- `finfo(fid, 'nom_option')` : Retourne la valeur de l'information spécifiée pour le fichier ouvert.
- `fclose(fid)` : Ferme le fichier identifié par le FID. Retourne 0 si succès.
- `fdelete('fileref')` : Supprime l'assignation du fileref. Retourne 0 si succès.
Le script imprime les résultats de chaque étape (`put rc=;`, `put fid=;` etc.) pour illustrer le comportement des fonctions. Le chemin 'c:\tmp333' est un chemin de fichier Windows, mais les fonctions restent compatibles avec SAS Viya 4 sur des systèmes d'exploitation Linux, en ajustant le chemin en conséquence (ex: `/tmp/tmp333`).
Copié !
data a;
/* Does fileref "curdirfl" exist? No = 0 */
rc=fexist ("curdirfl");
put;
put "Fileref curdirfl exist? rc should be 0 (no); " rc=;
/* assign fileref */
rc=filename("curdirfl", "c:\tmp333");
/* RC=0 indicates success in assigning fileref */
put "Fileref assigned - rc should be 0; " rc=;
rc=fexist ("curdirfl");
/* Does file which "curdirfl" points to exist? No = 0 */
/* Assigning a fileref doesn't create the file. */
put "File still doesn't exist - rc should be 0; " rc=;
rc=fileref ("curdirfl");
/* Does fileref "curdirfl" exist? */
/* Negative means fileref exists, but file does not */
/* Positive means fileref does not exist */
/* Zero means both fileref and file exist */
put "Fileref now exists - rc should be negative; " rc=;
put;
/* Does the file that the fileref points to exist? Should be no. */
if ( fileexist ("./tmp333") ) then
/* if it does, open it for input */
do;
put "Open file for input";
fid=fopen ("curdirfl", "i") ;
end;
else /* most likely scenario */
do;
put "Open file for output";
fid=fopen ("curdirfl", "o");
end;
/* fid should be non-zero. 0 indicates failure. */
put "File id is: " fid=;
numopts = foptnum(fid);
put "Number of information items should be 6; " numopts=;
do i = 1 to numopts;
optname = foptname (fid,i);
put i= optname=;
optval = finfo (fid, optname);
put optval= ;
end;
rc=fclose (fid);
rc=fdelete ("curdirfl");
put "Closing the file, rc should be 0; "
rc=; run;
1
DATA a;
2
3
/* Does fileref "curdirfl" exist? No = 0 */
4
5
rc=fexist ("curdirfl");
6
put;
7
put "Fileref curdirfl exist? rc should be 0 (no); " rc=;
8
9
/* assign fileref */
10
11
rc=filename("curdirfl", "c:\tmp333");
12
13
/* RC=0 indicates success in assigning fileref */
14
15
put "Fileref assigned - rc should be 0; " rc=;
16
rc=fexist ("curdirfl");
17
18
/* Does file which "curdirfl" points to exist? No = 0 */
19
/* Assigning a fileref doesn't create the file. */
20
21
put "File still doesn't exist - rc should be 0; " rc=;
22
rc=fileref ("curdirfl");
23
24
/* Does fileref "curdirfl" exist? */
25
/* Negative means fileref exists, but file does not */
26
/* Positive means fileref does not exist */
27
/* Zero means both fileref and file exist */
28
29
put "Fileref now exists - rc should be negative; " rc=;
30
put;
31
32
/* Does the file that the fileref points to exist? Should be no. */
33
34
if ( fileexist ("./tmp333") ) then
35
/* if it does, open it for input */
36
do;
37
put "Open file for INPUT";
38
fid=fopen ("curdirfl", "i") ;
39
end;
40
else /* most likely scenario */
41
do;
42
put "Open file for OUTPUT";
43
fid=fopen ("curdirfl", "o");
44
end;
45
46
/* fid should be non-zero. 0 indicates failure. */
47
put "File id is: " fid=;
48
numopts = foptnum(fid);
49
put "Number of information items should be 6; " numopts=;
50
do i = 1 to numopts;
51
optname = foptname (fid,i);
52
put i= optname=;
53
optval = finfo (fid, optname);
54
put optval= ;
55
end;
56
rc=fclose (fid);
57
rc=fdelete ("curdirfl");
58
put "Closing the file, rc should be 0; "
59
rc=; RUN;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
« La manipulation programmatique des fichiers via les fonctions de l'étape DATA est une compétence avancée qui offre un contrôle bien plus fin que les simples instructions INFILE ou FILE. Ce script illustre parfaitement la distinction cruciale entre un fileref (le pointeur logique) et le fichier physique (l'entité sur le disque). »
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.