为什么在 SAS 中使用列指针控件时最后一次观察会丢失?

Why does the last observation lost when using column pointer control in SAS?

在下面的代码中,我想知道为什么在使用列指针控件时最后一次观察(=carlo)丢失了?

data work.toExercise ; 
infile "/home/u61425323/BASE_DATA/exercise.txt" ; /* my direction */
input Name . +3 Nation . +2 Code . ;
title "Why is the last observation(=carlo) lost?" ;  
run;
proc print ; run ; 

下面是exercise.txt.

natasha   korea    a1111
kelly     america  b2222 
carlo     mexico   c333

下面是输出结果。

enter image description here

请原谅我糟糕的英语。

我认为发生这种情况是因为您的最后一条记录比代码预期的要短。 在这种情况下,您可以尝试使用 infile 选项之一来控制处理,例如:

infile "/home/u61425323/BASE_DATA/exercise.txt" MISSOVER;

我也不知道你的任务要求,但这个版本的代码可能会更稳定:

data work.toExercise ; 
  length Name  Nation  Code ;
  infile "/home/u61425323/BASE_DATA/exercise.txt" dlm=' ';
  input Name Nation Code;
  title "Why is the last observation(=carlo) lost?" ;  
run;

INFILE 语句中使用 TRUNCOVER 选项。

来自 INPUT 文档

TRUNCOVER

overrides the default behavior of the INPUT statement when an input data record is shorter than the INPUT statement expects. By default, the INPUT statement automatically reads the next input data record. TRUNCOVER enables you to read variable-length records when some records are shorter than the INPUT statement expects. Variables without any values assigned are set to missing.

要阻止 SAS 在行太短无法满足 INPUT 语句时换行输入,请在 INFILE 语句上使用 TRUNCOVER 选项。

让我们用您的可变长度记录创建一个文本文件。

filename text temp;
options parmcards=text;
parmcards;
natasha   korea    a1111
kelly     america  b2222 
carlo     mexico   c333
;

如果您使用数据步骤阅读它,我们会收到此消息:

NOTE: LOST CARD.
Name=carlo Nation=mexico Code=  _ERROR_=1 _N_=3
NOTE: 3 records were read from the infile TEXT.
      The minimum record length was 23.
      The maximum record length was 24.
NOTE: SAS went to a new line when INPUT statement reached past the end of a line.
NOTE: The data set WORK.ORGINAL has 2 observations and 3 variables.

但是当我们添加 TRUNCOVER 选项时,它会读取所有三个观察结果。

data want ; 
  infile text truncover ;
  input Name . +3 Nation . +2 Code . ;
run;

结果

不要使用古老的 MISSOVER 选项。该选项将丢弃行尾的文本,这些文本对于读取它们的格式来说不够长。如果您只使用 LIST MODE 输入样式,它可以工作,其中 SAS 调整信息格式的宽度以匹配行中下一个单词的长度,但无论如何您只是获得 TRUNCOVER 行为,所以为什么不具体。

data wrong ; 
  infile text missover ;
  input Name . +3 Nation . +2 Code . ;
run;