Csv SAS内嵌正在为某些列创建缺少的值
我正在经历一些非常奇怪的行为。我有一个CSV数据集,有很多列(3199)和148行/观察值。只有一些变量是有意义的,但是我已经解析并处理了我只需要找到的一些变量的值都是缺失的。直接查看CSV(在我可以查看的地方)并查看R中的数据可以确认数据是否丢失 我的数据步骤如下所示:Csv SAS内嵌正在为某些列创建缺少的值,csv,import,sas,Csv,Import,Sas,我正在经历一些非常奇怪的行为。我有一个CSV数据集,有很多列(3199)和148行/观察值。只有一些变量是有意义的,但是我已经解析并处理了我只需要找到的一些变量的值都是缺失的。直接查看CSV(在我可以查看的地方)并查看R中的数据可以确认数据是否丢失 我的数据步骤如下所示: DATA WORK.MYFILE; INFILE '\\[SERVER NAME]\[FOLDERS]\RawData.csv' lrecl=32760 DSD TRUNCOVER FIRSTOBS=3
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) 数据中有许多遗漏的观察结果。。。大多数都排在前几十排。(数据是从1980年第一季度开始的时间序列,我想要的变量在2000年第一季度之前丢失。)
2) 我在SAS企业指南上。我通过使用导入向导获得上述代码,将代码复制到程序中,然后删除infle
上方的格式化代码行,并将路径更改为实际CSV,而不是SAS使用向导创建的临时路径。当我这样做时,我找到并替换了所有$CHAR1.
和其他错误指定的信息
,并将所有内容更改为BEST32.
3) 我的直觉是,在某个列之后,所有变量都是按字母顺序列出的。我想要的变量如下:ACAINDIRR
,aedindir
,BVAINDIRR
,BVIINDIRR
,MWIINDIRR
,OHAINDIRR
,OOHINDIRR
。前三个变量各有104个未遗漏的观察值,如预期的那样。第四个(BVI…
)有43个未缺失的观测值,其余的没有未缺失的观测值
4) 我已经尝试了很多解决问题的方法来解决这个问题。唯一接近的是将CSV转换为at*.txt文件。奇怪的是,第四个变量BVIINDIRR有104个非缺失的观察值。但是,按字母顺序排列的后面的表仍然有0个未丢失的OB
非常感谢您的帮助
编辑
从输入
命令中删除?
不会导致任何错误或警告。我没有收到任何关于字符转换为数字的警告。日志中只有以下注释:
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
尝试将中缺少的列中的数据作为字符变量读取,使用诸如$CHAR200之类的信息(具有较长的长度,因此不太可能截断它-使用$CHAR1,第一个字符后面的所有内容都不会显示)。我的猜测是,您缺少的所有列都是字符数据,或者至少有一个字符,而SAS正忙着寻找数字数据——因为您在指定best32时告诉它
日志中是否有关于将字符值转换为数值的注释?如果没有,您引用的数据步骤将附带哪些注释?尝试使用$CHAR200等信息从中缺少的列中读取数据作为字符变量(长度较长的信息,因此您不太可能截断它-使用$CHAR1,第一个字符后的所有内容都不会显示)。我的猜测是,您缺少的所有列都是字符数据,或者至少有一个字符,而SAS正忙着寻找数字数据——因为您在指定best32时告诉它
日志中是否有关于将字符值转换为数值的注释?如果没有,您引用的数据步骤会附带哪些注释?您的LRECL显然不足。假设是一个非UTF代码页文件,您的文件是2300万字节,但只有148行。这意味着平均每行大约160000个字符。LRECL=32767不会降低这一点
增加你的LRECL(正如评论中所建议的,
LRECL=1M
可能是合理的),看看这是否解决了你的问题,或者你是否有其他问题需要用特定的字符变量来解决。你的LRECL显然不足。假设是一个非UTF代码页文件,您的文件是2300万字节,但只有148行。这意味着平均每行大约160000个字符。LRECL=32767不会降低这一点
增加你的LRECL(正如评论中所建议的,
LRECL=1M
可能是合理的),看看这是否解决了你的问题,或者你是否有其他问题需要用特定的字符变量来解决。删除??从代码中生成错误,这样您就知道哪里出了问题,哪里出了问题。@Reeza-没有导致任何错误或警告。我编辑了这个问题以包含注释。@Tony表示您需要增加LRECL,以便不再看到“一行或多行被截断”的消息。您可以将其设置得非常高,如LRECL=1M。一旦您不再看到截断消息,您将能够从消息“最大记录长度为…”中确定实际的LRECL。@RobertPenridge maximumLRECL
是您的操作系统允许的任何值。如果您想使用\u infle\u
(因为这是一个受字符变量限制的字符变量),则32767是最大值。@Joe小心,您在这里显示的是您的年龄;-)是的,我只是在SAS 9面世之前才开始使用SAS,所以我记得关于SAS 8的细节很少(除了它比SAS 9差得多)??从代码中生成错误,这样您就知道哪里出了问题,哪里出了问题。@Reeza-没有导致任何错误或警告。我编辑了这个问题以包含注释。@Tony表示您需要增加LRECL,这样您就不再需要