简单的问题。
PROC IMPORT OUT= braw.address
DATAFILE= "&path.\address_data.csv"
DBMS=csv REPLACE;
GETNAMES=YES;
RUN;
此语句将根据值将数据集列创建为字符或数字,这很聪明,但不是我想要的。
我想将它们全部作为字符导入,以便更轻松地进行正则表达式评估。
有没有一种简单的方法可以做到这一点?
简单的问题。
PROC IMPORT OUT= braw.address
DATAFILE= "&path.\address_data.csv"
DBMS=csv REPLACE;
GETNAMES=YES;
RUN;
此语句将根据值将数据集列创建为字符或数字,这很聪明,但不是我想要的。
我想将它们全部作为字符导入,以便更轻松地进行正则表达式评估。
有没有一种简单的方法可以做到这一点?
我通常只会为 CSV 编写自己的输入语句,然后您可以随意制作它们。
IE:
data braw.address;
infile "&path.\address_data.csv" dlm=',' dsd missover;
input
field1 $
field2 $
....
;
run;
您可以使用 PROC IMPORT 中的日志第一次生成此日志,然后对其进行编辑以包含每个变量的 $。
如果您不想编写 SAS 宏来将所有列作为字符读取,则可以尝试“作弊”。手动编辑文件并复制第一行(包含列标题的行。由于这些很可能都是字符串,SAS 应该将所有列作为字符导入。
当然,一个宏来做到这一点不会那么困难。你可以尝试这样的事情:
%macro readme(dsn,fn);
/* Macro to read all columns of a CSV as character */
/* Parameters: */
/* DSN - The name of the SAS data set to create */
/* FN - The external file to read (quoted) */
/* Example: */
/* %readme(want, 'c:\temp\tempfile.csv'); */
data _null_;
infile &fn;
input;
i = 1;
length headers inputstr $200;
headers = compress(_infile_,"'");
newvar = scan(headers,1,',');
do until (newvar = ' ');
inputstr = trim(inputstr) || ' ' || trim(newvar) || ' $';
i + 1;
newvar = scan(headers,i,',');
end;
call symput('inputstr',inputstr);
stop;
run;
data &dsn;
infile &fn firstobs=2 dsd dlm=',' truncover;
input &inputstr.;
run;
%mend;
%readme(want, 'c:\temp\tempfile.csv');
这是我读取 dlm 文件的宏,其中所有 vars 为 char:
%MACRO ImportText(file,dsn,dlm);
* Read data use proc import to get variable name and length;
PROC IMPORT DATAFILE="&file" OUT=temp DBMS=dlm REPLACE;
DELIMITER = &dlm;
GETNAMES = YES;
GUESSINGROWS = 32767;
RUN;
* Put variable names into macro variable;
PROC CONTENTS DATA=temp out=vars NOPRINT; RUN;
PROC SQL NOPRINT;
SELECT CATT(name,' : $',length,'.') INTO :vars SEPARATED BY ' ' FROM vars ORDER BY varnum;
QUIT;
* Read real data;
DATA &dsn;
INFILE "&file" DELIMITER=&dlm MISSOVER DSD FIRSTOBS=2 LRECL=32767;
INPUT &vars;
RUN;
%MEND;