通过数据线正确使用输入

时间:2019-02-01 19:32:36

标签: sas

我需要弄清楚正确的输入语句,以便从数据线中读取数据。

尝试过的指针和位置值

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;

我希望能够打印出数据行中写入的值

2 个答案:

答案 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
;