在SAS中读取,两行在不同位置结束和开始

在SAS中读取,两行在不同位置结束和开始,sas,Sas,我有两行观察结果要在SAS中阅读。 它是一个逗号分隔的数据集。 我的代码如下: DATA SASweek1.industry; INFILE "&Dirdata.Assignment1_Q6_data.txt" DLM="," DSD termstr=crlf TRUNCOVER; LENGTH Company $ 15; INPUT Company $ State $ Expense COMMA9. ; FORMAT Expense DOLLAR9.; *INF

我有两行观察结果要在SAS中阅读。 它是一个逗号分隔的数据集。 我的代码如下:

DATA SASweek1.industry;
  INFILE "&Dirdata.Assignment1_Q6_data.txt" DLM="," DSD termstr=crlf TRUNCOVER;
  LENGTH Company $ 15;
  INPUT Company $ State $ Expense COMMA9. ;  
  FORMAT Expense DOLLAR9.;
  *INFORMAT Expense DOLLAR10.;
RUN; * not ready;
原始数据集如下所示:

我能很好地打印出第一行观察结果, 但最后一个“0”将转到第二个的第一个位置 行,成为“0Lee的…”。
如有任何建议,将不胜感激

它只是做你让它做的事。你让它读9个字符

通常,您不应使用带分隔符数据的格式化输入模式。您可以通过在
INPUT
语句中的informat规范前面添加
(冒号)前缀,或者完全删除informat规范,并使用
informat
语句让SAS知道要使用什么informat来防止这种情况

但是您的数据没有正确分隔,因为最后一个字段包含分隔符,但值没有括在引号中。所以逗号使它看起来像两个值而不是一个。真正的解决方案是修复创建文件的进程,以创建有效的分隔文件。它需要引用包含逗号的值,或者从数字中删除逗号,或者使用数据中未出现的分隔符

幸运的是,因为它是行中的最后一个字段,所以您可以使用格式化输入来读取该字段。因为您使用的是
TRUNCOVER
选项,所以只需将INPUT语句中的信息宽度设置为最大值

DATA SASweek1.industry;
  INFILE "&Dirdata.Assignment1_Q6_data.txt" DLM="," DSD termstr=crlf TRUNCOVER;
  LENGTH Company $15 State $15 Expense 8;
  INPUT Company State Expense COMMA32. ;  
  FORMAT Expense DOLLAR9.;
RUN;

如果删除这些行,您会得到什么输出
FORMAT Expense DOLLAR9*信息费用美元10请将您的数据作为文本,要使用它,我必须键入它。您需要使用信息(输入前)来指定逗号格式,并且可以正确读取。在这篇文章中有一个完整的解释和解决方法的细节:再想想,这可能还不够接近。输出是日志。似乎变量“费用”的宽度尚未解决。在我换了32号通讯器之后。通信。它像我一样打印出第一行,但仍然没有下一行:(你对SAS撒谎。你告诉它行尾字符是CR+LF,但日志显示它只是LF。@汤姆,你完全正确!!!我在我知道之前就欺骗了可怜的SAS。我没有想到这会是个问题,因为我读了教科书,觉得不管怎样,在那里都比较安全。你愿意吗d让我知道你是如何从日志中得知这只是LF的?你触动了SAS的心,正如你所知。第一个线索是它将两行视为一行。然后在导致错误的行中显示值时,你可以看到字符的十六进制代码。你可以看到只有字符
'0A'x
b在两行之间。这是换行。
'0D'x
是回车。