我需要弄清楚正确的输入语句,以便从数据线中读取数据。
尝试过的指针和位置值
data oscar;
input @1 oscardate $ @9 oscaryear @14 budget dollar11. gross dollar13.
+1 title $16. +1 asofdate mmddyy10. +1 rating 3.1;
format asofdate mmddyy10. budget dollar12. gross dollar13.;
datalines;
27Feb11 2011 $15,000,000 $373,700,000 The Kings Speech 02/26/2012 8.2
07Mar10 2010 $11,000,000 $12,647,089 The Hurt Locker 02/26/2012 7.2
22Feb09 2009 $15,000,000 $141,319,195 Slumdog Millionaire 02/26/2012 8.2
24Feb08 2008 $25,000,000 $74,273,505 No Country for Old Men 02/26/2012 8.2
25Feb07 2007 $90,000,000 $289,800,000 The Departed 02/26/2012 8.5
05Mar06 2006 $6,500,000 $98,410,061 Crash 02/26/2012 8.0
;
run;
我希望能够打印出数据行中写入的值
答案 0 :(得分:1)
使用attrib
语句来声明和指定所输入变量的属性。该代码(对于人类而言)阅读起来会更简洁,而不是散布一些其他影响语句的属性,甚至可能是input
语句的隐式确定。
当数据的字符值带有多个内部单个空格时,您应该使用两个空格使值与其他值偏移(并使用&
输入修饰符),或者对数据值加双引号(并使用{{1 }}。
例如,标题由两个空格包围:
infile cards dsd dlm=" "
对于特别有害的数据行,您可能需要执行data oscar;
attrib
oscardate format=date9. informat=date9.
oscaryear format=4.
budget format=dollar13.0 informat=dollar13.0
gross format=dollar13.0 informat=dollar13.0
title length=$200
asofdate format=mmddyy10. informat=mmddyy10.
rating format=4.1
;
input oscardate oscaryear budget gross & title & asofdate rating;
datalines;
27Feb11 2011 $15,000,000 $373,700,000 The Kings Speech 02/26/2012 8.2
07Mar10 2010 $11,000,000 $12,647,089 The Hurt Locker 02/26/2012 7.2
22Feb09 2009 $15,000,000 $141,319,195 Slumdog Millionaire 02/26/2012 8.2
24Feb08 2008 $25,000,000 $74,273,505 No Country for Old Men 02/26/2012 8.2
25Feb07 2007 $90,000,000 $289,800,000 The Departed 02/26/2012 8.5
05Mar06 2006 $6,500,000 $98,410,061 Crash 02/26/2012 8.0
run;
来用整个行填充自动input;
变量,然后使用Perl正则表达式模式匹配来提取所需的部分。 / p>
其他数据行构造将确保所有数据字段按列对齐,在这种情况下,_infile_
修饰符可用于读取从特定列开始的值。 / p>
@
具有如此多的功能,没有最好的方法或唯一正确的陈述。
答案 1 :(得分:0)
当前行的格式未设置为可以解析它们的方式。这是因为它们使用空格作为字段之间的分隔符,但是TITLE字段也包含空格。您可以通过多种方法来修复数据线,以便解析它们。
您可以将行转换为使用不出现在任何字段中的其他定界符。竖线字符很有用。制表符('09'x)也很常见。
<div id="triangle-up"></div>
您可以在包含定界符(或引号)的任何值周围添加引号。
27Feb11|2011|$15,000,000|$373,700,000|The Kings Speech|02/26/2012|8.2
您可以使用固定长度的字段。
27Feb11 2011 $15,000,000 $373,700,000 "The Kings Speech" 02/26/2012 8.2
如果像在这种情况下那样,只有一个字段可能在行尾包含定界符位置。
27Feb11 2011 $15,000,000 $373,700,000 The Kings Speech 02/26/2012 8.2
07Mar10 2010 $11,000,000 $12,647,089 The Hurt Locker 02/26/2012 7.2
22Feb09 2009 $15,000,000 $141,319,195 Slumdog Millionaire 02/26/2012 8.2
24Feb08 2008 $25,000,000 $74,273,505 No Country for Old Men 02/26/2012 8.2
对于SAS,您也可以只确保TITLE值彼此之间不包含多个空格,然后确保Title后面至少有两个空格。然后,27Feb11 2011 $15,000,000 $373,700,000 02/26/2012 8.2 The Kings Speech
语句上的&
修饰符将告诉SAS在值中允许使用空格,但是在看到两个相邻的空格时停止读取该字段。
INPUT
如果无法固定输入行,并且只有一个字段具有嵌入空格,则可以在代码中解析该行。因此,对于这个,我只需将最后三个字段读入TITLE值,然后取出日期和等级并将其删除。
27Feb11 2011 $15,000,000 $373,700,000 The Kings Speech 02/26/2012 8.2
07Mar10 2010 $11,000,000 $12,647,089 The Hurt Locker 02/26/2012 7.2
22Feb09 2009 $15,000,000 $141,319,195 Slumdog Millionaire 02/26/2012 8.2
24Feb08 2008 $25,000,000 $74,273,505 No Country for Old Men 02/26/2012 8.2
如果您想将新版本的数据写为可以解析的文本,请使用FILE语句上的DSD选项和简单的put语句。
data oscar;
infile datalines truncover;
length oscardate 8 oscaryear 8 budget 8 gross 8 title $50 asofdate 8 rating 8;
informat oscardate date. budget gross dollar. asofdate mmddyy. ;
format oscardate asofdate yymmdd10. budget gross dollar12. rating 4.1 ;
input oscardate -- gross title $50. ;
rating = input(scan(title,-1,' '),32.);
asofdate = input(scan(title,-2,' '),mmddyy10.);
title = substrn(title,1,length(title)-length(scan(title,-1,' '))-length(scan(title,-2,' '))-2);
datalines;
27Feb11 2011 $15,000,000 $373,700,000 The Kings Speech 02/26/2012 8.2
07Mar10 2010 $11,000,000 $12,647,089 The Hurt Locker 02/26/2012 7.2
22Feb09 2009 $15,000,000 $141,319,195 Slumdog Millionaire 02/26/2012 8.2
24Feb08 2008 $25,000,000 $74,273,505 No Country for Old Men 02/26/2012 8.2
25Feb07 2007 $90,000,000 $289,800,000 The Departed 02/26/2012 8.5
05Mar06 2006 $6,500,000 $98,410,061 Crash 02/26/2012 8.0
;