我在将CSV文件读入SAS数据集时遇到问题,而没有为每个字段添加导入。我不希望每个字段都导入,但这是我似乎能够让这个工作的唯一方法。问题是我无法让SAS正确读取我的数据,即使它正确地读取了列...我认为问题的一部分是我的数据高于我的实际列标题,我不想阅读。< / p>
我的数据是这样布局的
somevalue somevalue somevalue...
var1 var2 var3 var4
abc abc abc abc
我想要排除某些值,只读取select var及其相应的数据。
下面是一个示例文件,其中我已经扰乱了我的字段中的所有值。我只想保留COLUMN H(8),AT(46)和BE(57)
这是我到目前为止尝试过的一些代码......
这是从PROC IMPORT生成的SAS。我的PROC IMPORT可以很好地读取每个字段值,所以我只删除了我不想要的字段,但是我没有得到我期望的输出。与字段对应的值不匹配。
A) PROC IMPORT
DATAFILE="C:\Users\dip1\Desktop\TU_&YYMM._FIN.csv"
OUT=TU_&YYMM._FIN
DBMS=csv REPLACE;
GETNAMES=NO;
DATAROW=3;
RUN;
在SAS日志中生成了这个(我删除了我不想要的其他字段)
B) DATA TU_&YYMM._FIN_TEST;
infile 'C:\Users\fip1\Desktop\TU_1701_FIN.csv' delimiter = ',' DSD lrecl=32767
firstobs=3 ;
informat VAR8 16. ;
informat VAR46 $1. ;
informat VAR57 $22. ;
format VAR8 16. ;
format VAR46 $1. ;
format VAR57 $22. ;
input
VAR8
VAR46 $
VAR57 $;
run;
我也尝试过这个......我相信我只是错过了一些东西......
C) DATA TU_TEST;
INFILE "C:\Users\fip1\Desktop\TU_&yymm._fin.csv" DLM = "," TRUNCOVER FIRSTOBS = 3;
LABEL ACCOUNT_NUMBER = "ACCOUNT NUMBER";
LENGTH ACCOUNT_NUMBER $16.
E $1.
REJECTSUBCATEGORY $22.;
INPUT ACCOUNT_NUMBER
E
REJECTSUBCATEGORY;
RUN;
除了尝试让SAS指向我想要读入的列,还要将上述内容修改为:
D) DATA TU_TEST;
INFILE "C:\Users\fip1\Desktop\TU_&yymm._fin.csv" DLM = "," TRUNCOVER FIRSTOBS = 3;
LABEL ACCOUNT_NUMBER = "ACCOUNT NUMBER";
LENGTH ACCOUNT_NUMBER $16.
E $1.
REJECTSUBCATEGORY $22.;
INPUT @8 ACCOUNT_NUMBER
@46 E
@57 REJECTSUBCATEGORY;
RUN;
这些都不起作用。再次,如果我用A)或B)引入所有字段,我可以成功地做到这一点,因为B)包括所有字段,但我不能得到C)或D)工作,我想要如果可以的话,尽量减少代码。我确定我错过了一些东西,但我从来没有时间修补它,所以我一直在做“长”的方式..
以下是数据外观的片段
A(1) B(2) C(3) D(4) E(5) F(6) G(7) ABCDEFGHIJ ABCDMCARD 202020 4578917 12345674 457894A (blank) CRA INTERNALID SUBCODE RKEY SEGT FNM FILEDATE CREDITBUR 2ABH123 AB2CHE123 A28O5176688 J2 Name 8974561
答案 0 :(得分:1)
使用分隔文件,您需要读取所有字段(或至少所有字段,直到您要保留的最后一个字段),即使您不想保留所有这些字段。对于你想跳过的那些你可以把它们读成你丢弃的虚拟变量。或者甚至是你要保留的一个变量,你将通过阅读后面的列来覆盖它。
在PROC IMPORT生成的代码之后,也不要对DATA步骤进行建模。您可以自己编写更清晰的代码。例如,您列出的三个变量不需要任何FORMAT或INFORMAT语句。虽然如果VAR8确实需要16位数字,您可能需要为其附加格式,以便SAS不使用BEST12。格式。
data tu_&yymm._fin_test;
infile 'C:\Users\fip1\Desktop\TU_1701_FIN.csv'
dlm=',' dsd lrecl=32767 truncover firstobs=3
;
length var8 8 var46 $1 var57 $22 ;
length dummy $1 ;
input 7*dummy var8 37*dummy var46 10*dummy var57 ;
drop dummy ;
format var8 16. ;
run;
如果需要(或添加RENAME语句),可以将VARxx变量名替换为更有意义的变量名。在这里使用位置编号可以使INPUT语句从输入数据中读取57列更清晰。