SAS INFILE正在为某些列创建缺失值

时间:2016-08-04 21:24:37

标签: csv import sas

我经历了一些非常奇怪的行为。我有一个包含大量列(3199)和148行/观察值的CSV数据集。只有一些变量是有意义的,但是我已经解析并操纵我需要的只是发现许多变量具有全部缺失的值。直接查看CSV(我可以)并将数据查看到R确认数据 NOT 缺失。

我的数据步骤如下:

 DATA WORK.MYFILE;
  INFILE '\\[SERVER NAME]\[FOLDERS]\RawData.csv'
  lrecl=32760
  DSD
  TRUNCOVER
  FIRSTOBS=3  ;
INPUT
    F1               : $ CHAR6.
    ACAAAE31RR       : ?? BEST32.
    ACAAAE32RR       : ?? BEST32.
    ACAAAE33RR       : ?? BEST32.
    ACAAAE3BRR       : ?? BEST32.

 /* lots and lots of lines like this */

    SHAW5564TT3R     : ?? BEST32.
    SHAW6599TT3R     : ?? BEST32.
    SHAX0099TTAR     : ?? BEST32. ;
 RUN;

在我拿出我想要的数据之前,一切似乎都很好,并意识到这迫使一些缺失的变量。我的猜测是在某个专栏(我不知道哪个)之后,只有缺少值一直到观察行的末尾,这可能会使以后的列变为失踪?? (显然,我是SAS的新手。)

背景

如果相关的话。

1)数据有许多缺失的观察结果......其中大部分都在前几十行中。 (数据是从1980Q1开始的时间序列,我想要的变量在2000Q1之前就丢失了。)

2)我在SAS EnterpriseGuide上。我通过使用IMPORT向导,将代码复制到程序中,然后删除INFILE上方的格式化代码行并更改实际CSV的路径而不是SAS向导创建的临时代码来获取上述代码。当我这样做时,我找到并替换了所有$CHAR1.和其他错误指定的informats,并将所有内容更改为BEST32.

3)在一些专栏之后,我对于强迫失踪的预感是因为所有变量都按字母顺序排列。我想要的变量如下:ACAINDIRRAEDINDIRRBVAINDIRRBVIINDIRRMWIINDIRROHAINDIRROOHINDIRR。如前所述,前三个变量各有104个非缺失观测值。第四个(BVI...)有43个非缺失的观测值,其余的没有缺失观测值。

4)我已经尝试过一堆麻烦事情来解决这个问题。唯一接近的是将CSV转换为* .txt文件。奇怪的是,第四个变量BVIINDIRR有104个非缺失的观测值。但是,按字母顺序排列的后者仍然有0个非缺失的障碍物。

非常感谢任何帮助!!

修改

??命令中删除INPUT并不会导致任何错误或警告。我没有收到有关字符转换为数字的任何警告。日志中唯一的注释是:

  NOTE: The infile  '\\[SERVER NAME]\[FOLDERS]\RawData.csv'is:
  Filename= \\[SERVER NAME]\[FOLDERS]\RawData.csv,
  RECFM=V,LRECL=32760,File Size (bytes)=23765791,
  Last Modified=03Aug2016:08:50:21,
  Create Time=03Aug2016:10:52:33

NOTE: 148 records were read from the infile  '\\[SERVER NAME]\[FOLDERS]\RawData.csv'.
  The minimum record length was 32294.
  The maximum record length was 32760.
  One or more lines were truncated.
NOTE: The data set WORK.PARETO has 148 observations and 31998 variables.
NOTE: MVA_DSIO.OPEN_CLOSE| _DISARM|         STOP| _DISARM| 2016-08-05T08:47:01,746-04:00| _DISARM| WorkspaceServer| _DISARM| SAS| 
  _DISARM| | _DISARM| 148| _DISARM| 28418048| _DISARM| 10| _DISARM| 11| _DISARM| 66861615| _DISARM| 569154881| _DISARM| 
  0.296875| _DISARM| 0.672000| _DISARM| 1786020421.075000| _DISARM| 1786020421.747000| _DISARM| 0.281250| _DISARM| | _ENDDISARM 
NOTE: PROCEDURE| _DISARM|         STOP| _DISARM| 2016-08-05T08:47:01,746-04:00| _DISARM| WorkspaceServer| _DISARM| SAS| _DISARM| | 
  _DISARM| 682061824| _DISARM| 26718208| _DISARM| 10| _DISARM| 11| _DISARM| 72237092| _DISARM| 569155157| _DISARM| 4.750000| 
  _DISARM| 7.937000| _DISARM| 1786020413.810000| _DISARM| 1786020421.747000| _DISARM| 2.453125| _DISARM| | _ENDDISARM 
 NOTE: DATA statement used (Total process time):
  real time           7.93 seconds
                        08:45 Friday, August 5, 2016

  cpu time            4.75 seconds

2 个答案:

答案 0 :(得分:1)

尝试使用诸如$ CHAR200之类的信息从字符变量中的缺失列中读取数据(长度较长的东西,因此您不太可能将其截断 - 在第一个字符获胜后使用$ CHAR1所有内容' t出现)。我的猜测是,你缺少的所有列都是字符数据,或者至少有一个字符,而SAS正在忙着寻找数字 - 因为你在指定best32时告诉它。

日志是否恰好提供了有关字符值转换为数值的注释?如果没有,你引用的datastep会附带哪些注释?

答案 1 :(得分:1)

您的LRECL显然不足。假设一个非UTF代码页文件,您的文件是2300万字节但只有148行。这是每行大约160000个字符的平均值。 LRECL = 32767不会削减它。

增加您的LRECL(如评论中所述,lrecl=1M可能是合理的)并查看是否能解决您的问题,或者您是否还有其他需要使用特定字符变量解决的问题。