如何从SAS中的较大文件创建截断的永久数据库

时间:2015-01-28 04:17:15

标签: database sas

我正在尝试将逗号分隔的.txt文件(在下面的代码中称为“file.txt”)读入SAS,以便创建一个仅包含一些变量和观察值的永久数据库。

以下是.txt文件的片段供参考:

SUMLEV,REGION,DIVISION,STATE,NAME,POPESTIMATE2013,POPEST18PLUS2013,PCNT_POPEST18PLUS
10,0,0,0,United States,316128839,242542967,76.7
40,3,6,1,Alabama,4833722,3722241,77
40,4,9,2,Alaska,735132,547000,74.4
40,4,8,4,Arizona,6626624,5009810,75.6
40,3,7,5,Arkansas,2959373,2249507,76

我的(缩写)代码如下:

options nocenter nodate ls=72 ps=58;
filename foldr1 'C:\Users\redacted\Desktop\file.txt';
libname foldr2 'C:\Users\redacted\Desktop\Data';
libname foldr3 'C:\Users\redacted\Desktop\Formats';
options fmtsearch=(FMTfoldr.bf_fmts);

proc format library=foldr3.bf_fmts;
[redacted]
run;

data foldr2.file;
infile foldr1 DLM=',' firstobs=2 obs=52;
input STATE $ NAME $ REGION $ POPESTIMATE2013;
PERCENT=POPESTIMATE2013/316128839;
format REGION $regfmt.;
run;

proc print data=foldr2.file;
sum POPESTIMATE2013 PERCENT;
title 'Title';
run;

在我的INPUT语句中,列出了我想要包含在新截断数据库中的变量(STATE,NAME,REGION等)。

当我打印截断的数据库时,我注意到我的所有INPUT变量都对应于原始文件中的相同变量。 相反,我的变量打印出来像这样:

  • STATE(在INPUT中列出的第一个var)打印为SUMLEV(列出的第一个var) .txt文件)
  • NAME(在INPUT中列出的第二个变量)打印为REGION(.txt文件中列出的第二个变量)
  • 区域(第3个“”“)作为DIVISION(第3个”“”“)打印
  • POPESTIMATE2013(第4个“”“)打印为STATE(第4个”“”“)

似乎SAS根据订单匹配我的INPUT变量,而不是名称。因此,因为我在INPUT语句中列出了STATE ,所以SAS打印出原始.txt文件的第一个变量(即SUMLEV变量)。

知道我的代码有什么问题吗?谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

您当前的数据步骤告诉SAS如何命名txt文件中的前四个变量。要做你想做的事,你需要在"输入"中列出txt文件中的所有变量。声明。然后,在数据语句中,使用keep =选项选择要包含在输出数据集中的变量。

data foldr2.file (keep=STATE NAME REGION POPESTIMATE2013 PERCENT);
  infile foldr1 DLM=',' firstobs=2 obs=52;
  input
    SUMLEV
    REGION $
    DIVISION
    STATE $
    NAME $
    POPESTIMATE2013
    POPEST18PLUS2013
    PCNT_POPEST18PLUS;
  PERCENT=POPESTIMATE2013/316128839;
  format REGION $regfmt.;
run;

答案 1 :(得分:1)

您当前的代码正在读取CSV文件每行的前4个值,并将它们分配给具有您列出的名称的列。

input语句列出了您要读入的所有列(以及从中读取它们的位置),它不会在输入文件中搜索命名列。

下面的代码应该产生你想要的输出。 keep语句列出了输出中所需的列。

data foldr2.file;
    infile foldr1 dlm = "," firstobs = 2 obs = 52;
    /* Prevent truncating the name variable */
    informat NAME $20.;
    /* Name each of the columns */
    input SUMLEV REGION DIVISION STATE NAME $ POPESTIMATE2013 POPEST18PLUS2013 PCNT_POPEST18PLUS;
    /* Keep only the columns you want */
    keep STATE NAME REGION POPESTIMATE2013 PERCENT;
    PERCENT = POPESTIMATE2013/316128839;
    format REGION $regfmt.;
run;

对于稍微复杂一点的解决方案,请参阅Joe的优秀答案here。将此方法应用于数据将需要提前设置列的长度并将字符值转换为数字。

data foldr2.file;
    infile foldr1 dlm = "," firstobs = 2 obs = 52;
    length STATE 8. NAME $13. REGION 8. POPESTIMATE2013 8.;
    input @;
    STATE = input(scan(_INFILE_, 4, ','), best.);
    NAME = scan(_INFILE_, 5, ',');
    REGION = input(scan(_INFILE_, 2, ','), best.);
    POPESTIMATE2013 = input(scan(_INFILE_, 6, ','), best.);
    PERCENT = POPESTIMATE2013/316128839;
    format REGION $regfmt.;
run;

如果您希望更熟悉SAS,那么看看SAS documentation阅读文件是值得的。