Je regarde deux procédures pour importer deux fichiers txt dans SAS. Le premier fichier est de largeur fixe. Le deuxième fichier txt est un fichier délimité. Le code SAS ci-dessous:

  1. DATA filename;  
    INFILE "filelocation";  
    INPUT  
    VAR1 $1-11  
    VAR2 $13-16  
    @18 VAR3 MMDDYY10.   
    VAR4 $29-53;  
    
    INFORMAT VAR1 $11.;  
    INFORMAT VAR2 $4.;  
    INFORMAT VAR3 MMDDYY10.;  
    INFORMAT VAR4 $25.;  
    FORMAT VAR1 $11.;  
    FORMAT VAR2 $4.;  
    FORMAT VAR3 MMDDYY10.;  
    FORMAT VAR4 $25.;  
    ;  
    RUN;  
    
  2. DATA filename;  
    INFILE "filelocation" DELIMITER="|" MISSOVER  
    DSD LRECL=32767;  
    INFORMAT VAR1 $11.;  
    INFORMAT VAR2 $4.;  
    INFORMAT VAR3 MMDDYY10.;  
    INFORMAT VAR4 $25.;  
    FORMAT VAR1 $11.;  
    FORMAT VAR2 $4.;  
    FORMAT VAR3 MMDDYY10.;  
    FORMAT VAR4 $25.;  
    INPUT  
    VAR1 $  
    VAR2 $  
    VAR3   
    VAR4 $  
    ;  
    RUN;  
    

Mes questions sont:
1. Pourquoi "INPUT" se trouve-t-il au début du code dans la première procédure, mais dans le dernier dans la deuxième procédure? L'ordre de "INPUT" est-il important?

  1. Dans la première procédure, il y a un "@ 18" devant VAR3, qui VAR3 est une variable représentant la date, et il détermine que le VAR3 commence à partir de la position 18e. Toutes les variables peuvent-elles utiliser cette expression? ex. À 1 VAR1 $
    À 13 VAR2 $
    @ 18 VAR3 MMJJAA10.
    @ 29 VAR4 $;

  2. Dans la procédure2,
    CONTRIBUTION VAR1 $
    VAR2 $
    VAR3
    VAR4 $
    pourquoi la variable n'a-t-elle aucun nombre après le signe "$" pour déterminer la longueur de la variable?

Je vous remercie!

1
mumu.W 5 janv. 2016 à 09:07

2 réponses

Meilleure réponse

La principale différence dont vous parlez est la différence entre les données stockées dans les emplacements de colonne FIXED et les données DELIMITED. Étant donné que votre premier exemple utilise des données avec des emplacements de colonnes fixes, vous pouvez utiliser des plages de colonnes (1-11) pour lire les données. Avec des données délimitées, vous ne pouvez pas spécifier de colonnes fixes (ou même des longueurs fixes à lire) car vous ne savez pas combien de caractères il y a entre les délimiteurs. Au lieu de cela, vous devez utiliser l'entrée en mode liste et SAS lira la valeur jusqu'au séparateur suivant.

Abordons les questions détaillées.

  1. Pourquoi? Parce que c'est ainsi que le programme a été écrit. Il existe une grande flexibilité dans la façon dont vous écrivez le code SAS.

La chose importante à comprendre concernant l'ordre des instructions lors de la création d'un ensemble de données est l'impact que l'ordre peut avoir sur le résultat. SAS essaiera de déterminer la définition des variables que vous utilisez dès que possible. Ainsi, si vous placez une instruction FORMAT avant votre instruction INPUT, cela peut avoir un impact à la fois sur le type de variable que SAS crée et sur l'ordre dans lequel elles sont créées dans l'étape de données.

  1. Non, ils ne sont pas les mêmes.

Lorsque vous lui demandez de lire VAR1 $ 1-11, vous lui demandez de lire tout ce qui se trouve dans les colonnes 1 à 11, y compris les blancs incorporés. Il sait également que vous voulez que VAR1 soit défini comme caractère (puisque vous avez utilisé le $) et qu'il devrait avoir de la place pour 11 octets. Lorsque vous lui demandez de lire @1 VAR1 $, il lira le mot suivant qu'il voit à partir de la colonne 1. Il s'arrêtera au premier blanc. Il peut donc lire les colonnes 1 à 5 ou les colonnes 70 à 77, si les colonnes 1 à 69 sont vides. Cela rendra également VAR1 une longueur de seulement 8 (sauf si vous l'avez défini précédemment) car c'est la valeur par défaut pour les variables de caractère lorsque SAS ne peut pas dire que vous voulez une longueur différente.

La raison pour laquelle le programme d'origine a utilisé @18 VAR3 MMDDYY10. est que vous devez spécifier l'informat pour que SAS convertisse correctement le texte des données en nombre que SAS utilise pour représenter cette date et vous ne pouvez pas le faire avec une plage de colonnes.

  1. Vous n'avez pas besoin de la longueur. Vous n'avez même pas besoin du $ puisque vous avez déjà défini le type de variable.

Vous avez précédemment défini la longueur de la variable la première fois qu'elle a été référencée. Ainsi, la ou les instructions INFORMAT ont eu l ' effet secondaire de définir la longueur de la variable en plus de l'INFORMAT qui devrait être utilisé pour convertir le texte en cours de lecture. Si vous voulez vraiment définir vos variables, vous devez utiliser une instruction LENGTH ou ATTRIB.

1
Tom 6 janv. 2016 à 04:19
  1. En raison de la façon dont SAS traite une étape de données, l'ordre des instructions n'a pas toujours d'importance. Je ne sais pas dans ce cas si cela importe ou non, mais ce n'est certainement pas conventionnel. En général, INFORMAT / FORMAT précède l'instruction d'entrée. Vous pouvez cependant l'exécuter et le vérifier assez facilement.
  2. Il s'agit de la méthode de contrôle du pointeur et déplace le curseur de lecture vers la colonne spécifiée. La documentation est claire:

    @n déplace le pointeur sur la colonne n.

  3. $ spécifie une variable de caractère, la longueur ou le format de la variable n'est pas requis et peut être préalablement spécifié à l'aide d'une instruction INFORMAT / FORMAT / LENGTH.
0
Reeza 5 janv. 2016 à 22:50