首页 > 解决方案 > 输入文本文件,缺少输出日期格式

问题描述

我是 SAS 新手。我有一个输入 txt 文件并将其上传到我的工作目录,当我读取并格式化 DATE_JOINED 列时,缺少日期,代码如下:

    data example_txt;
    infile '/home/u59667351/example_csv/example_csv.txt' dlm='<|>' firstobs=2;
    input PERSON_ID $ DEPT_ID $ DATE_JOINED yymmdd10. ;
    format DATE_JOINED yymmdd10.;
run;

名为 example_csv 的文本文件如下:

PERSON_ID<|>DEPT_ID<|>DATE_JOINED
AAAAA<|>S1<|>2021/01/03
BBBBBB<|>S2<|>2021/02/03
CCCCC<|>S1<|>2021/03/05

缺少 DATE_JOINED 列的 OUTPUT 日期。

在此处输入图像描述

有什么建议吗?

谢谢

标签: sas

解决方案


您的数据步骤中有两个错误。

首先是您在使用DLM=INFILE 选项时看起来像是要使用该DLMSTR=选项。当您在 DLM= 选项中列出多个字符时,每个单独的字符都被视为分隔符。使用 DLMSTR= 选项,整个序列必须完全按照指定的方式出现,才能被视为分隔符。

其次是您尝试使用 FORMATTED 输入模式读取 DATE_JOINED,这违背了读取分隔数据的目的。由于光标指向<标记 DEPT_ID 值结束的那个之后,接下来的 10 个字符不代表有效日期。使用 LIST 模式输入,在开始从文件中读取下一个值之前,会跳过任何前导分隔符。

在 INPUT 语句中使用信息规范时,在其前面加上:修饰符以使用 LIST 输入模式而不是 FORMATTED 模式。
或者删除内联信息并使用 INFORMAT 语句设置在将文本读入该变量时要使用的信息。

您可能还想在 INFILE 语句中添加 TRUNCOVER 选项,这样当最后一个值为空时,INPUT 语句就不会转到下一行来查找值。

data example_txt;
  infile '/home/u59667351/example_csv/example_csv.txt'
      dlmstr='<|>' firstobs=2 truncover
  ;
  input PERSON_ID $ DEPT_ID $ DATE_JOINED :yymmdd. ;
  format DATE_JOINED yymmdd10.;
run;

PS 当使用 LIST 模式输入时,您的信息规范中的宽度将被忽略。不管它包含多少字符,都会使用该行上的整个下一个值。


推荐阅读