我正在学习一本小书。以下是书中的代码。和原始数据。问题是当我运行它时,最终的数据集在行尾没有丢失记录,即它保持缺失75和56,并将它们标记为缺失("。")。任何人都可以指出问题可能出在哪里?当我在行末75和56之后添加空格时,问题就消失了。
DATA class;
INFILE 'c:\MyRawData\Scores.dat';
INPUT Score @@;
RUN;
PROC UNIVARIATE DATA = class;
VAR Score;
TITLE;
RUN;
该文件中的数据:
56 78 84 73 90 44 76 87 92 75
85 67 90 84 74 64 73 78 69 56
87 73 100 54 81 78 69 64 73 65
运行后显示更像
56 78 84 73 90 44 76 87 92 .
85 67 90 84 74 64 73 78 69 .
87 73 100 54 81 78 69 64 73 65
答案 0 :(得分:1)
我怀疑你的行尾有什么问题;要么你有一个虚假的角色,要么你的行尾以某种方式是不正确的。很可能你使用的是Windows文件并且你在Unix中运行,所以你有
75CRLF85
因为Unix只使用LF作为行终止符,所以它会看到" 75CR" endofline" 85&#34 ;, not" 75"内线" 85"喜欢它。
在这种情况下,你可以做你做过的事情 - 增加一个空间,尽管这可能会留下一些空白的空白'记录在那里 - 或在TERMSTR
语句中使用infile
告诉SAS如何正确读取文件。
否则,您可能会有一些虚假的结束字符 - 例如,如果您从网上粘贴此字符,则可能会有一个不会转换为常规空间的不间断空格。
你可以这样做:
data _null_;
infile 'c:\rawdata\myfile.dat';
input @;
put _infile_ $HEX60.;
run;
60是线长度的2倍。这告诉你SAS看到了什么。你应该看到什么:
3536203738203834203733203930203434203736203837203932203735
3835203637203930203834203734203634203733203738203639203536
383720373320313030203534203831203738203639203634203733203635
ASCII中的数字是30 +数字,因此35是5,36是6等。空格是20.第一行:
35|36|20|37|38|20|38|34|20|37|33|20| ...
所以5 6空间7 8空间3 8空间7 3空间。如果您在37 35之后看到其他内容,那么您就知道存在问题。您可能会看到以下任何内容:
0A
=换行。0D
=回程。A0
=不间断(网络)空间。你可以看到很多其他的东西,但那些最有可能让你失望的东西。从网上粘贴通常是个问题。