programacion - Cuando estoy exportando un conjunto de datos SAS a csv; está recortando todos los espacios principales en los personajes
proc export sas txt (2)
Me parece una pregunta interesante, en gran parte porque estaba seguro de saber la respuesta ... para descubrir que no.
Esto es técnicamente una solución, y si estás en una crisis de tiempo quizás sea suficiente, aunque sospecho que es demasiado difícil de usar de una manera práctica. Primero genero los datos (ingreso usando $ CHAR8. Para preservar los espacios iniciales), luego los obtengo usando salida de columna fija en lugar de salida de lista.
data test;
input
@1 x $CHAR8.
@9 y $CHAR8.;
format x y $char8.;
datalines;
USA China
Canada N Korea
Russia Mexico
;;;;
run;
data _null_;
file "c:/temp/test.csv" lrecl=80 dropover;
set test;
if _n_ = 1 then do;
put "x,y";
end;
put @1 x $char8. @9 "," @10 y $char8.;
run;
Desafortunadamente, el uso de DBMS = CSV no parece permitir $ CHAR8. para funcionar como cabría esperar No sé por qué es eso. La solución que esperaba era escribirlo así:
data _null_;
file ''c:/temp/test.csv'' delimiter='','' DROPOVER lrecl=32767;
if _n_ = 1 then /* write column names or labels */
do;
put
"x"
'',''
"y"
;
end;
set TEST;
put x $ :char8. y $ :char8.;
run;
que es esencialmente el código impreso en el registro por PROC EXPORT, luego con: $ CHAR8. después de cada variable. Por alguna razón, eso (y un montón de cosas similares) no funcionó. ODS CSV tampoco parece funcionar para preservar los espacios principales.
Cuando estoy exportando un conjunto de datos SAS a csv; está recortando todos los espacios principales en los personajes. Por favor, ayúdenme a conservar todos los espacios principales en la salida csv. La declaración utilizada es:
Proc Export Data = Globl_Mth_Sumry
OutFile = "&GMUPath./20&RptYr._&RptMt./03 Output/01 GMU/&Brnd_Abbr./&Brnd._&Mkt._Globl_Mth_Sumry_&RptMt.&RptYr.&NeuronQTR..csv"
DBMS = CSV Replace;
Run;
Entonces, hay una columna que contiene la lista de países que es como
Asia India China etc. Pero el archivo csv lo está mostrando como: - Asia India China.
Por favor ayuda.
Al igual que Joe, estaba intrigado. No parece que PROC EXPORT
haga lo que usted desea. Pero aquí hay una macro SAS que podría hacer el truco:
%macro mydlm(dsn, outf, dlm, headers);
/*****************************************************************
MYDLM.SAS
SAS Macro to create a delimited file from a SAS data set
Positional Parameters
DSN = SAS Dataset Name
OUTF = Output Text File
DLM = Delimiter to use (CSV, TAB, PIPE, or constant)
HEADERS = Y or N, Include line with variable names at top
Example
%mydlm( sashelp.class , ''c:/temp/tempfile.csv'', csv, Y);
****************************************************************/
%if %QUPCASE(&DLM)=CSV %then %let DLM=%str(,);
%else %if %QUPCASE(&DLM)=TAB %then %let DLM=''09''x;
%else %if %QUPCASE(&DLM)=PIPE %then %let DLM=%str(|);
proc contents noprint data=&DSN
out=_temp_(keep=name type length varnum label format formatd formatl);
run;
proc sort data=_temp_;
by varnum;
run;
data _null_;
set _temp_ end=eof;
call symput(cats(''zvnm'',put(_n_,5.)), name);
if format ne '' ''
then call symput(cats(''zvft'',put(_n_,5.))
, cats(format
, put(formatl,best.), ''.''
, put(formatd,best.))
);
else if type=2
then call symput(cats(''zvft'',put(_n_,5.)),cats(''$char'',put(length,best.),''.''));
else call symput(cats(''zvft'',put(_n_,5.)),'' '');
if eof then call symput(''zvcnt'',left(put(_n_,8.)));
run;
data _null_;
file &outf;
set &dsn;
%if %upcase(&headers) = Y %then %do;
if _n_ = 1 then put
%do i =1 %to %eval(&zvcnt.-1);
"''%trim(&&zvnm&i)''" "&dlm"
%end;
"''%trim(&&zvnm&zvcnt)''" ;
%end;
put
%do i =1 %to %eval(&zvcnt.-1);
&&zvnm&i &&zvft&i "&dlm"
%end;
&&zvnm&i &&zvft&i;
run;
%mend mydlm;
La macro le permite elegir CSV, TAB o PIPE (|) como delimitador. Las variables de caracteres tendrán preservados los espacios iniciales principales y el ancho de todas las variables se basará en cualquier formato de variable SAS predefinido. Probé la macro con esta muestra:
data a;
number2 = 2;
format num comma7.;
format date yymmdd10.;
format char $char40.;
date = today();
num = 1; char = '' This has 10 leading blanks''; output;
num = 2; char = ''This has no leading blanks''; output;
run;
%mydlm( a , ''c:/temp/tempfile.csv'', csv, y);
ACTUALIZACIÓN: para dar crédito, el código anterior se derivó de las ideas que encontré en esta página web . Solo te habría apuntado a ese enlace pero realmente no hizo lo que quieres. Es realmente difícil de leer también.
ACTUALIZACIÓN2 : revisó la macro de ejemplo para corregir un error de sintaxis y hacerlo más genérico. Esta nueva versión le permite especificar cualquier cadena de caracteres como un delimitador de columna. Estoy agregando esto para apoyar esta otra pregunta de Desbordamiento de pila , que se puede responder utilizando la siguiente llamada a macro:
%mydlm( Exp_TXT, ''/fbrms01/dev/projects/tadis003/Export_txt_OF_New.txt'', ~|~, Y);