我正在研究在SAS中导入两个txt文件的两个过程。第一个文件是固定宽度。第二个txt文件是分隔文件。 SAS代码如下:
DATA filename;
INFILE "filelocation";
INPUT
VAR1 $1-11
VAR2 $13-16
@18 VAR3 MMDDYY10.
VAR4 $29-53;
INFORMAT VAR1 $11.;
INFORMAT VAR2 $4.;
INFORMAT VAR3 MMDDYY10.;
INFORMAT VAR4 $25.;
FORMAT VAR1 $11.;
FORMAT VAR2 $4.;
FORMAT VAR3 MMDDYY10.;
FORMAT VAR4 $25.;
;
RUN;
DATA filename;
INFILE "filelocation" DELIMITER="|" MISSOVER
DSD LRECL=32767;
INFORMAT VAR1 $11.;
INFORMAT VAR2 $4.;
INFORMAT VAR3 MMDDYY10.;
INFORMAT VAR4 $25.;
FORMAT VAR1 $11.;
FORMAT VAR2 $4.;
FORMAT VAR3 MMDDYY10.;
FORMAT VAR4 $25.;
INPUT
VAR1 $
VAR2 $
VAR3
VAR4 $
;
RUN;
我的问题是:
1.为什么“INPUT”位于第一个过程中代码的开头,但是在第二个过程的最后一个? “输入”的顺序是否重要?
在第一个程序中,VAR3前面有一个“@ 18”,VAR3是一个变量代表日期,它确定VAR3从第18位开始。所有变量都可以使用这个表达式吗?
恩。
@ 1 VAR1 $
@ 13 VAR2 $
@ 18 VAR3 MMDDYY10。
@ 29 VAR4 $;
在程序2中,
INPUT
VAR1 $
VAR2 $
VAR3
VAR4 $
为什么变量在“$”符号后面没有任何数字来确定变量的长度?
谢谢!
答案 0 :(得分:1)
您正在讨论的主要区别是存储在FIXED列位置的数据与DELIMITED数据之间的差异。由于您的第一个示例使用具有固定列位置的数据,因此您可以使用列范围(1-11
)来读取数据。使用分隔数据时,您无法指定固定列(甚至是固定的读取长度),因为您不知道分隔符之间有多少个字符。相反,您必须使用列表模式输入,SAS将读取值到下一个分隔符。
让我们来处理详细的问题。
在构建数据集时,了解语句顺序的重要一点是订单可能对结果产生的影响。 SAS将尽快确定您正在使用的变量的定义。因此,如果在FORMAT
语句之前放置INPUT
语句,它可能会影响SAS创建的变量类型以及它们在数据步骤中创建的顺序。
当你要求它阅读VAR1 $ 1-11
时,你要求它阅读第1至11列中的任何内容,包括任何嵌入的空格。它还知道您希望将VAR1定义为字符(因为您使用了$
)并且它应该有11个字节的空间。当你要求它阅读@1 VAR1 $
时,它会读到它从第1列开始看到的下一个单词。它将在第一个空格处停止。因此,如果第1列到第69列为空,则可能会读取第1列到第5列,或者它可能会读取第70列到第77列。它还将使VAR1的长度仅为8(除非您之前已定义),因为当SAS无法判断您是否需要不同的长度时,这是字符变量的默认值。
原始程序使用@18 VAR3 MMDDYY10.
的原因是因为您需要指定信息以使SAS正确地将数据中的文本转换为SAS用于表示该日期的数字,而您无法使用列范围。
$
,因为您已经定义了变量类型。您之前已首次设置变量的长度。因此,除了应该用于转换正在读取的文本的INFORMAT之外,INFORMAT
语句还具有设置变量长度的副作用。如果您确实要定义变量,则应使用LENGTH
或ATTRIB
语句。
答案 1 :(得分:0)
@n 将指针移动到列n。