从CSV导入所有列作为字符?在许多变量csv数据

时间:2016-07-06 14:00:46

标签: csv macros sas

我在以下网址找到了答案。

Import all columns from CSV as character?

但是,对于我的数据,这个宏只导入43个变量,这应该是4126个变量。

我认为这个问题可能来自宏语法

直到(newvar ='');

但是,我无法解决这个问题。

有些人可以教我如何解决它。

我的csv数据可以按照以下dropbox链接下载。

https://www.dropbox.com/s/m01iaqkg5s0tkl2/1771020.csv?dl=0

%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');

1 个答案:

答案 0 :(得分:1)

对于3000个变量,您的主要问题可能是线路长度过长。确保在INFILE语句中使用LRECL选项。

您可以忽略变量名称。

data want ;
  infile "myfile" dsd firstobs=2 truncover lrecl=1000000 ;
  length var1-var3000 $200 ;
  input var1-var3000;
run;

或者您可以从第一行读取名称并使用它们来生成代码。您可能无法使用宏变量,因为它们限制为65K字符。从名称生成LENGTH语句会更容易。

filename code temp;
data _null_;
  file code ;
  if _n_=1 then put 'LENGTH';
  if eof then put ' $200 ;';
  infile "myfile" dsd obs=1 lrecl=1000000 end=eof;
  length name $32 ;
  input name @@ ;
  put ' ' name ;
run;

然后,您可以在创建表的步骤中使用该LENGTH语句。

data want ;
  infile "myfile" dsd firstobs=2 truncover lrecl=1000000 ;
%include code / source2 ;
  input (_all_) (+0) ;
run;

还要确保设置COMPRESS选项,因为您可能会创建比它们需要的时间长得多的变量。您可以设置系统选项。

options compress=yes;

或使用数据集选项。

data want (compress=yes);

如果列标题实际上不是变量名,则将它们用作标签。您可以更改代码生成步骤,如下所示生成LENGTH和LABEL语句,以使用通用名称VAR1,VAR2,...命名变量。

data _null_;
  file code ;
  if _n_=1 then put 'LABEL';
  if eof then put ';' / 'LENGTH VAR1-VAR' N ' $200 ;';
  infile "myfile" dsd obs=1 lrecl=1000000 end=eof;
  length label $256 ;
  input label @@ ;
  N+1;
  put ' VAR' N '=' label :$quote. ;
run;