SAS 编程 - 数据步骤 - 文本到 SAS 数据集解析问题

SAS Programming - DATA Step - Text to SAS Data Set Parsing Issue

我正在尝试从文本文件创建 SAS 数据集。文本文件以如下格式显示数据:

-HEADER HEADER HEADER

-HEADER HEADER HEADER

4 月 SpringRace 男子

$$$$$$$$$$$$$$$$$$$

姓名年龄州/这些是文本文件中的标题/

$$$$$$$$$$$$$$$$$$$

约翰·史密斯 30 CA

Mark Doe 49 TX

5月SpringRace2女

$$$$$$$$$$$$$

姓名年龄州

$$$$$$$$$$$$$

贝蒂·怀特 50 ME

简·史密斯 37 纽约


我在数据步骤中遇到的问题是:by-passing 改变 header 行,然后在 ****** 标题之前收集 "event" 数据 ** ***** 作为变量,然后跳过 标题 并为实际人员分配变量。它在整个巨大的文本文件中都是类似的格式。请问谁能指出我正确的方向吗?

我一直在试验: 数据work.test; infile c:\tester dlm=' , $' 遗漏; 输入 / / / 每月 15 美元。活动名称 $15。性别 $6。 (这是我卡住的地方,因为我不知道如何跳过文本文件中的 "Name Age State" 并将变量分配给 "John Smith 30 CA" 等。) 运行;

我还认为必须有更好的方法来通过 headers,因为不能确定它们总是只有 2 行长。

谢谢

我认为在 INPUT 语句中使用 @'my_char_string' 列指针会对您有所帮助,前提是分隔数据值的标题总是重复并且您知道它们是什么。例如:

INFILE mydatafile FLOWOVER FIRSTOBS=2;

INPUT month $ race $ sex $ @'State' first_name $ last_name $ address $;

INFILE 语句中的 FIRSTOBS=2 选项跳过 HEADER HEADER... 行,FLOWOVER 选项告诉 SAS 在下一行继续查找数据,特别是 @'State'。您可能需要指定其他选项和格式,具体取决于您的输入文件格式、分隔符等。

根据您的编辑,您可以使用月份值来确定您正在读取事件的开始,然后使用尾随 @、保留和一些条件逻辑,在单独的行中读取您的参与者并保留参与者的事件信息,像这样(只需在第一个 if 子句中添加所有剩余的月份名称):

data test1;
    length test  month  event  gender  firstname  lastname  state ;
    infile "test1.txt" DLM=' $' FIRSTOBS=5; 

    retain month event gender;   * Keep these values from last readin;

    input test $ @;    /* Read in the first word in the data line being 
                         read into test var, and stay on this line for 
                         now (with @)*/

    if strip(test) in('April', 'May') then do; /* If test var contains month,
                                                 then read in all of the variables, 
                                                 and skip the name/age/state titles row*/
        input @1 month $ event $ gender $ @'State' firstname $ lastname $ age state $ ;
    end;
    else do;    /* Otherwise, the data line being read in should contain 
                  only names, age and state, so read in those values only.
                  The month, event and gender values will be kept the same 
                  by the retain statement above.*/ 
        input @1 firstname $ lastname $ age state $ ;
    end;
    drop test; /* Comment out this drop statement to see whats in test var*/
run;

此代码适用于每个活动的不同数量的参与者。但是为了使此代码起作用,不能缺少月份。

有用的提示:要查看 SAS 正在读取的当前数据行中的内容,请尝试添加

 put _INFILE_;

在 INFILE 语句之后。它会按照 SAS 的方式将数据行打印到您的日志中。

希望你很久以前就解决了你的问题,但这里还有另一个建议。 在输入语句上使用尾随 @ 可以让您应用第二个输入语句,这将是首选解决方案。这个解决方案并没有真正使用尾随的@,但我把它留给你以后考虑。

DATA test;
INFILE 'stacktest.txt' lrecl=200 missover;
length n1 n2 n3 n4 . ;
input @1 c1 . @1 c2 . @1 c5 . @1 lne & . @ ;
keep month event gender fname lname age state;
if c1 = ' ' then return;
if c1 = '-' then return;
if c1 = '$' then return;
if c5 = 'Name' then return;

n1 = scan(lne, 1);
n2 = scan(lne, 2);
n3 = scan(lne, 3);
n4 = scan(lne, -1);

if ( n3 eq 'Male' or n3 eq 'Female')  then do;
   month = n1 ;
   event = n2;
   gender = n3  ;
     return;
     end;
 else do ;
*  input  fname $ lname $ age  state $ ;
fname = n1 ;
lname = n2 ;
age   = n3 ;
state = n4 ;
     output;
      end;
 retain month event gender;
run;