首页 文章

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

提问于
浏览
0

我'm experiencing some very strange behaviour. I have a CSV data set with lots of columns (3199) and 148 rows/observations. Only some of the variables are of interest, but I'已解析并操纵我需要的只是找到许多变量具有 all missing 的值 . 直接查看CSV(我可以)并将数据查看到R确认数据缺失 NOT .

我的DATA步骤如下所示:

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的新手) .

BACKGROUND

如果它是相关的 .

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

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

3)我对某些专栏之后强迫失踪的预感是因为所有变量都按字母顺序排列 . 我想要的变量如下: ACAINDIRRAEDINDIRRBVAINDIRR ,_ BVIINDIRRMWIINDIRROHAINDIRROOHINDIRR . 如前所述,前三个变量各有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 回答

  • 1

    尝试使用$ CHAR200这样的信息读取缺失列中的数据,这些信息如$ CHAR200(长度很长的东西,所以你不太可能截断它 - 在第一个字符不显示之后用$ CHAR1一切) . 我的猜测是你缺少的所有列都是字符数据,或者至少有一个字符,而SAS正在忙着寻找数字 - 因为你在指定best32时告诉它 .

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

  • 1

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

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

相关问题