4

简单的问题。

PROC IMPORT OUT= braw.address
DATAFILE= "&path.\address_data.csv"
DBMS=csv REPLACE;
GETNAMES=YES;

RUN;

此语句将根据值将数据集列创建为字符数字,这很聪明,但不是我想要的。

我想将它们全部作为字符导入,以便更轻松地进行正则表达式评估。

有没有一种简单的方法可以做到这一点?

4

3 回答 3

3

我通常只会为 CSV 编写自己的输入语句,然后您可以随意制作它们。

IE:

data braw.address;
infile "&path.\address_data.csv" dlm=',' dsd missover;
input
 field1 $
 field2 $
....
;
run;

您可以使用 PROC IMPORT 中的日志第一次生成此日志,然后对其进行编辑以包含每个变量的 $。

于 2013-01-30T22:29:51.817 回答
1

如果您不想编写 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');
于 2013-01-31T00:00:34.837 回答
0

这是我读取 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;
于 2015-01-27T05:11:49.660 回答