在SAS中读取txt文件

在SAS中读取txt文件,sas,Sas,我正在尝试将txt文件读入SAS。下面是我的代码。我假设有13行5列。我的输出只有6行 data Voter_Population; length Year 4 Voting_age_Population $11 Voter_Registration $11 Turnout $11 Turnout_Percent 4; infile "&path\Voter Population.txt" dlm="\t" dsd; input Year 1-4 Voting_age_Populat

我正在尝试将txt文件读入SAS。下面是我的代码。我假设有13行5列。我的输出只有6行

data Voter_Population;
length Year 4 Voting_age_Population $11
Voter_Registration $11
Turnout $11
Turnout_Percent 4;
infile "&path\Voter Population.txt" dlm="\t" dsd;
input   Year 1-4 Voting_age_Population $6-17
       Voter_Registration $18-29
       Turnout $31-42
       Turnout_Percent 46-48;
运行

这就是我的数据集的样子。 我不想使用
数据线

1964    114,090,000 73,715,818  70,644,592  61.9
1968    120,328,186 81,658,180  73,211,875  60.8
1972    140,776,000 97,328,541  77,718,554  55.2
1976    152,309,190 105,037,986 81,555,789  53.6
1980    164,597,000 113,043,734 86,515,221  52.6
1984    174,466,000 124,150,614 92,652,680  53.1
1988    182,778,000 126,379,628 91,594,693  50.1
1992    189,529,000 133,821,178 104,405,155 55.1
1996    196,511,000 146,211,960 96,456,345  49.1
2000    205,815,000 156,421,311 105,586,274 51.3
2004    221,256,931 174,800,000 122,294,978 55.3
2008    231,229,580 0       132,618,580 56.8
2012    240,926,957 0       130,234,600 53.6
有人能帮我吗。 这就是我要说的

    Year    Voting_age_Population   Voter_Registration  Turnout Turnout_Percent
1964    "4  114,090,0"  "   73,715,818" 70,644,592  1968
1972    "2  140,776,0"  "   97,328,541" 77,718,554  1976
1980    "0  164,597,0"  "   113,043,73" "   86,515,221" 52.6
1984    "4  174,466,0"  "   124,150,61" "   92,652,680" 53.1
1988    "8  182,778,0"  "   126,379,62" "   91,594,693" 50.1
1992    "2  189,529,0"  "   133,821,17" "   104,405,15" "   55."
1996    "6  196,511,0"  "   146,211,96" "   96,456,345" 49.1
2000    "0  205,815,0"  "   156,421,31" "   105,586,27" "   51."
2004    "4  221,256,9"  "   174,800,00" "   122,294,97" "   55."

首先,您可能误解了长度语句的作用。它是变量的存储字节数。数字默认为8字节(双精度浮点)。对于字符变量,它是字符数,除非使用双字节字符集(DBCS)

通过使用$-Voting\u age\u Population、Voter\u Registration、turbout定义长度,您强制这些变量为字符而非数字。您的所有数据似乎都是数字。如果它们存储为字符字段,则不能将它们用于均值、模式、最大值、标准偏差或任何其他数字

Chris J.说得对,你应该使用COMMA12。字段2-4的信息。此外,如果字段之间有空格,则不需要指定起始列和结束列

INPUT Year 4. Voting_age_Population COMMA12. Voter_Registration COMMA12. Turnout COMMA12. Turnout_Percent 4.1 ;

应该为您提供数值,然后您可以对其运行统计测试。

首先,您可能误解了LENGTH语句的作用。它是变量的存储字节数。数字默认为8字节(双精度浮点)。对于字符变量,它是字符数,除非使用双字节字符集(DBCS)

通过使用$-Voting\u age\u Population、Voter\u Registration、turbout定义长度,您强制这些变量为字符而非数字。您的所有数据似乎都是数字。如果它们存储为字符字段,则不能将它们用于均值、模式、最大值、标准偏差或任何其他数字

Chris J.说得对,你应该使用COMMA12。字段2-4的信息。此外,如果字段之间有空格,则不需要指定起始列和结束列

INPUT Year 4. Voting_age_Population COMMA12. Voter_Registration COMMA12. Turnout COMMA12. Turnout_Percent 4.1 ;

应该给你数值,然后你可以对其进行统计测试。

不管Ludwig指出的其他问题,你遇到问题的具体原因是你没有正确输入数据

首先,数据行长度对于输入语句来说不够长。这意味着,默认情况下,SAS将转到下一行并从那里读取数据-这是一个大问题,因为您的数据实际上并没有这样做。(过去经常这样做,但现在已经不多了。)您应该在
infle
语句中添加
TRUNCOVER
misshover
,以获得该行为(SAS不会继续到下一行)

其次,您显然有分隔的数据,而不是固定宽度的数据。除非你用数据粘贴误导我们。它看起来像是用制表符分隔的。这意味着您不应该指定列位置,因为它们可能会移动(例如,您的一些总体长度不是11位,事实上大多数都不是)。您似乎知道它是分隔的,但实际上并没有使用正确的分隔(列表)输入。而且,您使用了错误的分隔符-“\t”不正确

正确的方法是使用INFORMAT(如下所示)、更正分隔符并使用列表输入

data Voter_Population;
  informat   /* informat is what tells SAS how to read variables in - not length */
  Year 4.
  Voting_age_Population $12. /* or COMMA12. to become numeric*/
  Voter_Registration $12.  /* same */
  Turnout $12. /* same*/
  Turnout_Percent 4.  /* I would make this longer - what if you have 100% turnout? */
  ;  

  infile "&path\Voter Population.txt" dlm="09"x /* right for tab delimiter */ dsd truncover;
  input   
    Year 
    Voting_age_Population $
    Voter_Registration $
    Turnout $
    Turnout_Percent
  ;
run;

不管Ludwig指出的其他问题,您遇到问题的具体原因是您没有正确输入数据

首先,数据行长度对于输入语句来说不够长。这意味着,默认情况下,SAS将转到下一行并从那里读取数据-这是一个大问题,因为您的数据实际上并没有这样做。(过去经常这样做,但现在已经不多了。)您应该在
infle
语句中添加
TRUNCOVER
misshover
,以获得该行为(SAS不会继续到下一行)

其次,您显然有分隔的数据,而不是固定宽度的数据。除非你用数据粘贴误导我们。它看起来像是用制表符分隔的。这意味着您不应该指定列位置,因为它们可能会移动(例如,您的一些总体长度不是11位,事实上大多数都不是)。您似乎知道它是分隔的,但实际上并没有使用正确的分隔(列表)输入。而且,您使用了错误的分隔符-“\t”不正确

正确的方法是使用INFORMAT(如下所示)、更正分隔符并使用列表输入

data Voter_Population;
  informat   /* informat is what tells SAS how to read variables in - not length */
  Year 4.
  Voting_age_Population $12. /* or COMMA12. to become numeric*/
  Voter_Registration $12.  /* same */
  Turnout $12. /* same*/
  Turnout_Percent 4.  /* I would make this longer - what if you have 100% turnout? */
  ;  

  infile "&path\Voter Population.txt" dlm="09"x /* right for tab delimiter */ dsd truncover;
  input   
    Year 
    Voting_age_Population $
    Voter_Registration $
    Turnout $
    Turnout_Percent
  ;
run;

在字段2、3和4中使用
comma12.0
informat。只需评论您的问题。日期线通常用于演示想法或生成示例数据。说您不想使用数据行是没有意义的。问题是您的文件是以制表符分隔的,并且您正在使用列输入。必须使用“列表”输入读取分隔文件DSD。去掉输入语句中的列范围。对字段2、3和4使用
comma12.0
informat。只需注释您的问题。日期线通常用于演示想法或生成示例数据。说您不想使用数据行是没有意义的。问题是您的文件是以制表符分隔的,并且您正在使用列输入。必须使用“列表”输入读取分隔文件DSD。去掉输入语句中的列范围。Joe,OP可能使用$informats来防止逗号充当分隔符。一旦你改成逗号信息,你就没事了。不需要truncover、misshover或指定分隔符。数据中的所有13行都有五个数值。Joe,OP可能使用$informats来防止逗号充当分隔符。一旦你改成逗号信息,你就没事了。不需要truncover、misshover或指定分隔符。数据中的所有13行都有五个数值。