SAS - 读取原始/分隔文件

时间:2017-02-17 18:17:28

标签: csv sas

我在将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

1 个答案:

答案 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列更清晰。