SAS CSV导入添加垃圾数据列

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.;

我正在尝试将数据导入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.;
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将忽略信息上的宽度,并将其使用的宽度调整为实际数据的宽度。