从CSV导入所有列作为字符?

时间:2013-01-30 21:43:14

标签: sas

简单的问题。

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

RUN;

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

我想将它们全部导入为角色,以便更容易进行正则表达式评估。

有一种简单的方法吗?

3 个答案:

答案 0 :(得分:2)

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

IE:

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

您可以使用PROC IMPORT中的日志第一次生成此内容,只需编辑它以包含每个变量的$。

答案 1 :(得分: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');

答案 2 :(得分:0)

这是我的宏读取dlm文件,所有变量为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;