SAS CSV导入添加垃圾数据列
我正在尝试将数据导入SAS Enterprise Guide。该文件最初是通过在Mac上保存Excel文档生成的csv。有三列,日期、DayOfYear和MonthOfYear 我的导入代码如下所示:SAS CSV导入添加垃圾数据列,csv,sas,enterprise-guide,Csv,Sas,Enterprise Guide,我正在尝试将数据导入SAS Enterprise Guide。该文件最初是通过在Mac上保存Excel文档生成的csv。有三列,日期、DayOfYear和MonthOfYear 我的导入代码如下所示: DATA indata; INFILE '/sasdata/{path_to_file}' TERMSTR=cr DSD DLM=','; INPUT Date YYMMDD10. DayOfYear MonthOfYear; FORMAT Date YYMMDD10.;
DATA indata;
INFILE '/sasdata/{path_to_file}' TERMSTR=cr DSD DLM=',';
INPUT Date YYMMDD10. DayOfYear MonthOfYear;
FORMAT Date YYMMDD10.;
RUN;
问题是,这会导致日期列之后的所有内容都被移动一列。示例输出:
Date | DOY | MOY
2017-01-01 | | 1
2017-01-02 | | 2
2017-01-03 | | 3
我的黑客解决方案是添加一个名为junk的额外列来获取所有空值,但如果可能的话,我想真正解决这个问题。在下面黑客
DATA indata;
INFILE '/sasdata/{path_to_file}' TERMSTR=cr DSD DLM=',';
INPUT Date YYMMDD10. junk DayOfYear MonthOfYear;
FORMAT Date YYMMDD10.;
RUN;
Date | junk | DOY | MOY
2017-01-01 | | 1 | 1
2017-01-02 | | 2 | 1
2017-01-03 | | 3 | 1
我试过干扰线路馈送和马车返回,但都没有用。我同时加入了DSD和DLM,但这并没有改变任何事情。看起来日期的末尾有一个额外的不可见字符,它在它自己的列中结束,但是当我在十六进制编辑器中查看数据时,那里什么都没有。比如说
ef bb bf 32-30 31 37 2d-30 31 2d 30-31 2c 31 ...
它直接从2017-01-01变为逗号到1。所以没有隐藏的字符。我不确定这是怎么发生的。这是我遇到这个问题的第二个文件,所以我知道这不是一次性的
总结一下我的问题,如何避免只为日期后的垃圾变量创建额外的列?您应该使用冒号(:)在输入语句中应用信息,如下所示:
DATA indata;
INFILE '/sasdata/{path_to_file}' TERMSTR=cr DSD DLM=',';
INPUT Date : YYMMDD10. DayOfYear MonthOfYear;
FORMAT Date YYMMDD10.;
RUN;
根据:
(冒号)格式修饰符使您可以使用列表输入,但也可以使用
在变量名后指定信息,无论是字符还是
数字的。SAS一直读取,直到遇到一个空白列,即定义的
变量的长度(仅限字符)或数据行的结尾,
以先到者为准
如果您正在读取分隔数据,则应使用列表模式输入。您可以从
输入
语句中删除所有信息,或者在输入
语句中的信息之前添加:
修饰符,以便仍使用修改列表模式。如果从输入语句中删除信息,则可以使用INFORMAT
语句来告诉SAS如何读取日期变量
data indata;
infile '/sasdata/{path_to_file}' termstr=cr dsd truncover ;
length Date DayOfYear MonthOfYear 8;
input Date DayOfYear MonthOfYear;
informat date yymmdd. ;
format Date yymmdd10.;
run;
当您告诉SAS在读取带分隔符的数据行时使用格式化输入时,可能会发生三种情况,所有这些都是不好的
(1) 您可能读取的字符太少,因此会得到错误的结果。这还将导致日期值的其余部分被读取为下一列的值
(2) 读取的字符太多,因此尝试读取下一个分隔符作为日期的一部分,甚至是下一个值的一部分。并且可能只保留下一列要读取的下一个值的一部分
(3) 准确读取正确的字符数,以便日期正确,但随后将光标位置保留在下一个分隔符之前。然后,如果您使用DSD选项允许空值,这将使SA认为下一个值为空,并从本质上将行的其余部分移到错误的列中。这只是一个想法,但是如果您尝试使用冒号(:)应用格式化输入-例如
输入日期:YYMMDD10。
?@Allan Bowe修复了它!请随意添加答案,我会接受的。所以请确保我理解。因为我添加了日期信息,这将覆盖仅查找前一行中指定的分隔符。当您在单独的行上指定信息时,则分隔符首先将列分隔开,然后应用信息?当您说input date yymmdd10.
时,意味着正好读取10个字符。使用列表样式时,它根据分隔符读取下一个单词中的字符数。请注意,使用列表模式时,SAS将忽略信息上的宽度,并将其使用的宽度调整为实际数据的宽度。