【问题标题】:SAS Input StatementSAS 输入语句
【发布时间】:2016-07-20 16:11:12
【问题描述】:

我有一个自动执行文件,当我连接到不同的服务器时,它会加密我的密码......代码如下所示:

%global wspwd ewspwd hpwd ehpwd ;

/* Enter WORKSTATION Password Below */
filename ewspwdfl "/home/&sysuserid./ewspwd.txt" ;
proc pwencode in=’XXXXXXXX’ out=ewspwdfl ; run ;
data _null_ ;
    infile ewspwdfl obs=1 length=l ;
    input @ ;
    input @1 line1 $varying1024. l ;
    call symput('ewspwd',cats(substr(line1,1,l))) ;
    call symput('wspwd',cats(‘XXXXXXXX’)) ;
run ; 

我的问题是:为什么

input @ ; 

包括在内以及为什么

input @1 line1 $varying1024. l ;

还不够。

每当我使用 SAS 创建数据集时,我都不必包含“input @;”在我的声明中。我只是简单地写一些类似的东西:

input @1 firstname $ @15 lastname $ @30 date mmddyy6.;

【问题讨论】:

  • 您认为为什么需要它?您是否尝试删除它并使其不起作用?在什么情况下它不起作用?
  • 我已经设置好了...我以为我不需要它,但我不确定依赖这个 autoexec 文件的所有意外情况,所以我没有更改任何内容。我与之交谈的人不知道它的目的......
  • 您需要它来填充某些 INFILE 选项。如 FILENAME= 选项或 EOV= 选项。但我认为您的代码使用的 LENGTH= 选项不需要它。
  • 我很困惑你为什么需要这个。 SAS不会明白你有一个变量并且它的值以@1开头吗???我从来不用单独使用“Input @;”然后再次输入状态..
  • 仅供参考 - pwencode 不安全。见stackoverflow.com/questions/8157160/…

标签: encryption passwords sas


【解决方案1】:

该数据步骤不需要它。您可以将其简化为。

data _null_ ;
  infile ewspwdfl obs=1 TRUNCOVER ;
  input line1 $CHAR1024. ;
  call symputX('ewspwd',line1);
  call symputX('wspwd',‘XXXXXXXX’) ;
run ; 

使用input @ 是创建程序的好方法,您可以在其中使用不同的输入语句读取不同的行。您可以测试_infile_ 变量的内容,并根据读取的内容执行数据步骤的不同部分。

在 INFILE 语句中使用 EOV= 选项来检测您何时开始从新文件读取时也很有用,因为在您开始读取新文件之前不会设置它。所以INPUT @ 让 SAS 开始读取,以便设置 EOV 变量,但保持该行等待您真正的 INPUT 语句稍后读取。

如果您想将相同的列再次读取到不同的变量中,@1 很有用。例如,您可能希望将前几个字符读取为字符串,然后根据您发现的重新读取为数字或日期的内容对其进行测试。

【讨论】:

  • “使用输入@是创建程序的好方法,您希望使用不同的输入语句读取不同的行。”您指的是格式化、列、列表和名称输入吗?
  • 让您编写读取复杂垃圾的代码很有用,例如最近这个问题中有些人想阅读的报告。 stackoverflow.com/questions/38503002/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多