Comment importer un fichier CSV avec séparateur “;” et le séparateur décimal “,” en SAS?
J'ai (et recevront à l'avenir), de nombreux fichiers CSV qui utilisez le point-virgule comme délimiteur et la virgule comme séparateur décimal.
Jusqu'à présent, je ne pouvais pas savoir comment importer ces fichiers dans le SAS à l'aide de proc import-ou dans tout autre système automatisé de la mode sans la nécessité pour déconner avec les noms de variable manuellement.
Créer des données d'exemple:
%let filename = %sysfunc(pathname(work))\sap.csv;
data _null_;
file "&filename";
put 'a;b';
put '12345,11;67890,66';
run;
Le code d'importation:
proc import out = sap01
datafile= "&filename"
dbms = dlm;
delimiter = ";";
GETNAMES = YES;
run;
Après l'importation d'une valeur pour la variable "MONTANT" comme 350,58 (ce qui correspond à 350.58 dans le format AMÉRICAIN) ressemblerait à 35,058 (sens thirtyfivethousand...) en SAS (et après la ré-exportation vers l'allemand EXCEL, il devrait ressembler à 35.058,00).
Un simple mais sale solution serait la suivante:
data sap02; set sap01;
AMOUNT = AMOUNT/100;
format AMOUNT best15.2;
run;
Je me demande si il existe un moyen simple de définir le séparateur décimal pour les CVS-import (similaire à la spécification de la délimiteur). ..ou tout autre "nettoyeur" de la solution par rapport à ma solution de contournement.
Merci beaucoup d'avance!
merci, j'ai édité mon post!
OriginalL'auteur Joz | 2015-02-05
Vous devez vous connecter pour publier un commentaire.
Vous techniquement devez utiliser
dbms=dlm
pasdbms=csv
, si elle ne figure pas les choses. CSV signifie "valeurs séparées par des Virgules", alors que le DLM signifie "délimité", ce qui est correct ici.Je ne pense pas qu'il y a un moyen direct de faire des SAS de lire la virgule par
PROC IMPORT
. Vous devez dire à SAS à utiliser le NUMXw.d informat lors de la lecture dans les données, et je ne vois pas un moyen de forcer ce paramètre dans le SAS. (Il existe une option pour sortie avec une virgule,NLDECSEPARATOR
, mais je ne pense pas que les œuvres ici.)Votre meilleur pari est d'écrire des données à l'étape de code vous-même, ou à exécuter le
PROC IMPORT
, allez dans le journal, et de copier/coller le lire dans le code de votre programme; puis, pour chacun de la lecture d'enregistrements ajouter:NUMX10.
ou quel que soit le maximum de la largeur du champ est. Il va finir par ressembler à cela:Il permettra également de générer beaucoup d'informat et le code de format; vous pouvez convertir le informats à
NUMX10.
au lieu deBEST.
au lieu d'ajouter de l'informat à le lire. Vous pouvez aussi supprimer le informats, sauf si vous avez les champs de date.SAS permet de la gérer et Joe vous a montré comment faire. PROC IMPORT n'est rien, mais un utilitaire permettant de lire dans les fichiers de base -- il écrit une Données Étape de lire le fichier. Si le fichier n'est pas conforme à son idée de "base", alors vous avez besoin pour écrire les Données de l'Étape.
Edit: Difficile de croire que SAS cant supporter un banal problème de manière automatisée. Mais je suis actuellement en train de travailler avec la solution de Joe, merci beaucoup encore une fois!
PROC d'IMPORTATION pour les fichiers délimités très peu de fonctionnalités. Les données d'entrée pas à pas est ce que vous êtes largement prévu de l'utiliser pour quoi que ce soit à distance compliqué. Ce n'est pas une "solution de contournement", et il est automatisé (et automatisable) pour autant que je suis concerné. Je suis d'accord que c'est un peu surprenant que la SAS ne dispose pas d'une option lui permettant de considérer ',' un séparateur décimal, mais je ne suis pas sûr de savoir comment vraiment commun qui est dans le champ.
Je suppose que c'est tout simplement parce que pas assez de demande pour qu'elle existe - et il y a facilement-assez-faire des méthodes (y compris les méthodes automatiques) pour le faire de toute façon. SAS est très bon à l'ajout de nouvelles fonctionnalités lors de la demande - vous pouvez recommander une nouvelle fonctionnalité et avoir d'autres le vote, et la très de vote sont généralement mises en œuvre. Bien sûr, il n'est pas open source, donc vous n'avez pas tout à fait aussi beaucoup de fonctionnalités, mais ils sont assez bon à ce sujet.
OriginalL'auteur Joe
Cela a un inconvénient. Si il y a un changement dans la stucture du fichier csv, par exemple un changement de l'ordre des colonnes, alors on a changer le code dans le SAS programm.
Donc, il est préférable de changer de l'entrée, de la substitution dans les champs numériques de la virgule avec dot et en passant SAS de l'entrée modifiés.
La première idée était d'utiliser un programme perl pour cela, et d'utiliser ensuite dans le SAS d'un nom de fichier avec un tuyau pour lire l'entrée modifiés.
Malheureusement il y a un SAS de restriction dans la procédure d'importation: L'IMPORTATION de la procédure ne prend pas en charge les types de dispositifs ou méthodes d'accès pour le nom de fichier de résultats, sauf pour le DISQUE.
Donc on doit créer un workfile sur le disque avec le réglage de l'entrée.
J'ai utilisé le CVS_PP paquet de lire le fichier csv.
testdata.csv contient les données csv à lire.
substitute_commasep.perl est le nom du programme en perl
code perl:
SAS code:
OriginalL'auteur hoila