2017-06-07 1 views
-1

Je suis novice en programmation SAS et j'essaie de trouver le moyen le plus efficace de réaliser mon projet en cours. Fondamentalement, j'ai besoin de modifier le fichier .csv existant stocké sur le serveur SAS et l'enregistrer dans mon dossier sur le même serveur.Traitement de fichiers CSV - SAS

Modification nécessaire:

  • garder .csv au format
  • utilisation "|" au lieu de « » comme séparateur
  • ont le nom de sortie suivant: filename_YYYYMMDDhhmmss.csv
  • ne garder que 4 variables du fichier d'origine
  • renomme certaines des variables que nous gardons

Voici le script J'utilise actuellement, mais il y a quelques problèmes avec elle:

PROC IMPORT OUT = libname.original_file (drop=var0) 
       FILE = "/.../file_on_server.csv" 
       DBMS = CSV 
       REPLACE; 
RUN; 


%PUT date_human = %SYSFUNC(PUTN(%sysevalf(%SYSFUNC(TODAY())-1), datetime20.)); 

proc export data = libname.original_file (rename= (var1=VAR11 var2=VAR22 Type=VAR33)) 
     outfile = '/.../filename_&date_human..csv' label dbms=csv replace; 
     delimiter='|'; 
run; 

J'ai aussi un problème avec la variable appelée « type » lors du renommage comme il semble qu'il y ait un conflit avec certains des mots clés du système. Le format de date n'est pas bon non plus, et je n'ai malheureusement pas trouvé le format exact sur les forums SAS.

Un conseil pour rendre ce script plus efficace est grandement apprécié.

Répondre

1

Je ne voudrais pas essayer de lire réellement les données dans un ensemble de données SAS. Traitez-le simplement et écrivez-le. Si la structure d'entrée est cohérente, c'est plutôt simple. Lisez tout simplement comme des chaînes de caractères et affichez les colonnes que vous voulez conserver. Supposons que les données ont 12 colonnes et la dernière des quatre qui veulent conserver est la 10ème colonne. Donc, vous avez seulement besoin de lire dans 10 d'entre eux.

Commencez par configurer vos noms de fichiers d'entrée et de sortie dans des variables de macro pour faciliter la modification. Vous pouvez utiliser votre logique pour générer le nom de fichier du nouveau fichier. Ensuite, utilisez une simple étape DATA _NULL_ pour lire les données sous forme de chaînes de caractères et les réécrire à l'aide d'une simple étape DATA_NULL_. Vous pouvez même changer l'ordre relatif des quatre colonnes si vous voulez. Donc, ce programme va copier les 2e, 5e, 4e et 10e colonnes et changer les en-têtes de colonne à NewName1, NewName2, NewName3 et NewName4.

data _null_; 
    infile "&infile" dsd dlm=',' truncover; 
    file "&outfile" dsd dlm='|'; 
    length var1-var10 $200 ; 
    input var1-var10; 
    if _n_=1 then do; 
    var2='NewName1'; 
    var5='NewName2'; 
    var4='NewName3'; 
    var10='NewName4'; 
    end; 
    put var2 var5 var4 var10 ; 
run; 

Si certaines des données pour les quatre colonnes que vous souhaitez conserver sont plus de 200 caractères puis simplement mettre à jour l'instruction LONGUEUR.

Essayons donc une petite expérience. D'abord, faisons un fichier CSV factice.

filename example temp; 
data _null_; 
    file example ; 
    input; 
    put _infile_; 
cards4; 
a,b,c,d,e,f,g,h,i,j,k,l,m 
1,2,3,4,5,6,7,8,9,10,11,12,13 
o,p,q,r,s,t,u,v,w,x,y,z 
;;;; 

Maintenant, essayons de l'exécuter. Je vais modifier les instructions INFILE et FILE à lire à partir de mon fichier temporaire et écrire le résultat dans le journal.

infile example /* "&infile" */ dsd dlm=',' truncover; 
    file log /* "&outfile" */ dsd dlm='|'; 

Voici les lignes résultantes écrites.

NewName1|NewName2|NewName3|NewName4 
2|5|4|10 
p|s|r|x 
+0

merci beaucoup pour une explication si détaillée!Y at-il une raison pour laquelle je pourrais obtenir les nouveaux noms de variables nécessaires, mais le contenu est vide? –

+0

Assurez-vous que le PUT est après le bloc IF. Assurez-vous également que les lignes de données sont réellement délimitées par des virgules. Comme le bloc IF force les valeurs pour le premier enregistrement, il se peut que la première ligne soit également lue comme vide. Ajoutez cette instruction pour vider les 5 premières lignes. 'if _n_ <= 5 then putlog _infile_;' – Tom

+0

J'ai essayé de réparer mon script, et je n'ai toujours aucun résultat, mais les valeurs sont délimitées par "|" comme spécifié. –