我在以下网址找到了答案。
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');
答案 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;