【问题标题】:How to read missing data when reading txt file in SAS?在SAS中读取txt文件时如何读取丢失的数据?
【发布时间】:2016-09-18 02:15:16
【问题描述】:

我是 SAS 新手。

我想在 SAS 中读取一个 txt 文件。问题是文件在某些​​行中缺少数据。

例如数据是:

James Monroe        Monroe Hall         Virginia          58    4/28/1758   1816
John Quincy Adams   Braintree           Massachusetts     57    7/11/1767   1824    113,142 30.92%
Andrew Jackson      Waxhaws Region      South/North Carolina    61  3/15/1767   1828    642,806 55.93%
Martin Van Buren    Kinderhook          New York    54  12/5/1782   1836    763,291 50.79%
William Henry Harrison  Charles City County     Virginia    68  2/9/1773    1840    1,275,583   52.87%

我想要的列是“FullName”、“City”、“State”、“Age”、“DOB”、“Year”、“Number”和“Percentage”。

我的代码是:

infile 'C:\sasfiles\testfile.txt' missover dlm='09'x dsd
input FullName City State Age DOB Year Number PercVote;

Run;

但我得到了错误

9 CHAR Rutherford B. Hayes.Delaware ..Ohio..54.10/4/1822.1876.4,034,142.47.92% 73 区域 5776676676242246767046667676222004666003303323233330333303233323330332332 编号 2548526F2402E081953945C1712500099F89F9954910F4F18229187694C034C142947E925 全名=。城市=。状态=。年龄=。出生日期=。年份=54 数字=。 PercVote=1876 错误=1 N=19 注意:第 20 1-17 行中 FullName 的数据无效。 注意:第 20 行 19-32 中的城市数据无效。 注意:第 20 37-40 行中的州数据无效。 注意:第 20 46-55 行中的 Number 数据无效。 注意:第 20 62-70 行中 PercVote 的数据无效。

【问题讨论】:

  • 这不可能是你的全部代码吗?你有日期变量的信息吗?还是字符串?
  • @Reeza,我没有信息。
  • 尝试使用它们。并将 MISSOVER 更改为 TRUNCOVER。
  • @Reeza。不知道要不要在专栏里加w.d。例如,input FullName $23.。如果我这样做,它可能会带来下一列的一些子字符串。对于原始输入文本文件,我应该对其进行预处理吗?否则,如何对齐列?

标签: sas


【解决方案1】:

您需要以可以正确解析的格式提供数据。

使用分隔数据时,请使用相邻的分隔符来指示缺少值。最好在使用变量之前定义它们。如果您按顺序定义它们,那么您的输入语句可以非常简单。

data want ;
   infile cards dsd dlm='|' firstobs=2 truncover ;
   length name $13 city $11 state $15 age 8 dob 8 yod 8 ;
   input name -- yod ;
   informat dob mmddyy10.;
   format dob yymmdd10.;
cards;
----+----0----+----0----+----0----+----0----+----0----+----0----+----0
James Monroe|Monroe Hall|Virginia||4/28/1758|1816
John Quincy Adams|Braintree|Massachusetts|57|7/11/1767|1824 
;

或者强制数据进入列并使用列输入。

data want ;
   infile cards firstobs=2 truncover ;
   input name $ 1-13 city $ 19-29 state $ 31-45 age 47-48 @50 dob mmddyy10. yod 61-64;
   format dob yymmdd10.;
cards;
----+----0----+----0----+----0----+----0----+----0----+----0----+----0
James Monroe      Monroe Hall Virginia            4/28/1758 1816
John Quincy Adams Braintree   Massachusetts   57  7/11/1767 1824 
;

【讨论】:

  • 如果您点击问题上的编辑,您可以复制并粘贴原始数据行,这些数据行是制表符分隔的。块引用的选项卡在此站点上显示为空格。
  • Pipe 更适合发布示例,因为您可以看到它。
  • 我不确定是否应该将Dob 设置为数字格式?因为不知道yymmdd10.能不能做数学计算?长度大于8。
  • SAS 使用 8 字节浮点来存储所有数字,因此 8 是数字变量的正确长度。如果要存储整数,则可以使用较小的值,SAS 将在存储时截断该值。只有在处理非常大的数据并且需要节省磁盘空间时才值得这样做。用于显示日期的格式不会更改存储的值。我更喜欢使用 YMD 来显示日期,因为 MDY 或 DMY 值很容易混淆。
【解决方案2】:

试试这个:

data want;
infile cards dlm='09'x missover;
input (FullName City State) (:$32.) Age :8. DOB :mmddyy9. Year :4. Number :comma8. PercVote :percent8.;
format DOB mmddyy10. number comma16.  percvote percent6.2;
cards;
James Monroe        Monroe Hall         Virginia          58    4/28/1758   1816
John Quincy Adams   Braintree           Massachusetts     57    7/11/1767   1824    113,142 30.92%
Andrew Jackson      Waxhaws Region      South/North Carolina    61  3/15/1767   1828    642,806 55.93%
Martin Van Buren    Kinderhook          New York    54  12/5/1782   1836    763,291 50.79%
William Henry Harrison  Charles City County     Virginia    68  2/9/1773    1840    1,275,583   52.87%
;
run;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    相关资源
    最近更新 更多