在SAS中将HTML表的.txt文件重构为数据集

时间:2014-07-16 23:32:49

标签: sas

我目前正在使用SAS版本9来尝试读取HTML表格的.txt格式的平面文件,我从下一页(标题为Wayne Rooney的匹配历史记录)中获取:

http://www.whoscored.com/Players/3859/Fixtures/Wayne-Rooney 我使用Scrapy使用Python webscraper将数据转换为.txt文件。我的.txt文件的格式如下:

17-08-2013,1:4,斯旺西,曼联,28',7.26,助攻助攻,26-08-2013,0:0,曼联,切尔西,90' ,7.03,无,14-09-2013,2:0,曼联,水晶宫,90',8.44,比赛进球,17-09-2013,4:2,曼联,拜耳勒沃库森, 84',9.18,目标进球助攻,22-09-2013,4:1,曼彻斯特城,曼彻斯特联队,90',7.17,进球黄牌,25-09-2013,1:0,曼联,利物浦,90',无,比赛助攻,28-09-2013,1:2,曼联,西布罗姆维奇,90' ......

......等等。我想要的是一个与原始表格格式相同的数据集。我非常清楚地了解SAS,但往往不会那么多地使用infile语句。我在主题上尝试了一些变体,但是这个语法让我最接近我想要的东西:

filename myfile "C:\Python27\Football Data\test.txt";

    data test;
    length date $10.
           score $6.
           home_team $40.
           away_team $40.
           mins_played $3.
           rating $4.
           incidents $40.;

    infile myfile DSD;
    input date $
          score $
          home_team $
          away_team $
          mins_played $
          rating $
          incidents $ ;
run;

这将返回仅包含表的第一行的数据集。我已经尝试使用固定宽度和指针来设置数据集维度,但由于团队名称之类的事情的长度可能会发生很大变化,这导致数据从平面文件中错误地重新组装。

我想我大部分时间都在那里,但不能完全破解最后一点。如果有人知道我需要的确切语法会很棒。

由于

1 个答案:

答案 0 :(得分:2)

我会直接从网上阅读。像这样的东西;这个工作大概有50%,但写了整整十分钟,我确信它可以很容易地改进。

基本方法是使用@'string'读取字符串后面的文本。你可能最好以字节流的形式读取它并在<tr> ... </tr>上进行正则表达式匹配,然后解析它而不是在这里采用更强大的方法。

filename rooney url "http://www.whoscored.com/Players/3859/Fixtures/Wayne-Rooney" lrecl=32767;
data rooney;
infile rooney scanover;
retain are_reading;
input @;
if find(_infile_,'<table id="player-fixture" class="grid fixture">')
    then are_reading=1;
if find(_infile_,'</table>') then are_reading=0;
if are_reading then do;
    input @'<td class="date">' date ddmmyy10. 
          @'class="team-link">' home_team $20.
          @'class="result-1 rc">' score $10.
          @'class="team-link">' away_team $20.
          @'title="Minutes played in this match">' mins_played $10.
          @'title="Rating in this match">' rating $6.
    ;
output;
end;
run;

至于阅读scrapy输出,你应该至少改变两件事:

  • 添加分隔符。不是真的有必要,但如果没有它,我会认为代码不正确,除非分隔符是空格。
  • 添加尾随&#34; @@&#34;让SAS保持行指针,因为你的数据中没有换行符。

    数据想要; infile myfile flowover dlm =&#39;,&#39; dsd lrecl = 32767; 长度约10美元。            得分6美元。            home_team $ 40。            away_team $ 40。            mins_played 3美元。            等级4美元。            事件$ 40。;     输入日期$           得分$           home_team $           away_team $           mins_played $           评级$           事件$ @@; 运行;

Flowover是默认设置,但我希望将其包含在内以便明确。

您可能还想将日期作为日期值(而不是字符)输入,因此informat date ddmmyy10.;。如果您愿意,也可以轻松输入评分作为数字,如果您通过将':添加到分隔符来对这些分数进行分析,则可以将所播放的分数和分数输入为数字列表。

最后,.的长度不正确; SAS非常好,可以忽略它,但.只适用于格式。

这是我的最终代码:

data want;
infile "c:\temp\test2.txt" flowover dlm="',:"  lrecl=32767;
informat date ddmmyy10.
           score_1 score_2 2.
           home_team $40.
           away_team $40.
           mins_played 3.
           rating 4.2
           incidents $40.;
    input date 
          score_1 
          score_2
          home_team $
          away_team $
          mins_played 
          rating ??
          incidents $ @@;
run;

我删除dsd,因为它与'分隔符不兼容;如果实际需要DSD,那么您可以将其添加回来,删除该分隔符,并以char形式读取分钟数。我添加??进行评分,因为它有时是&#34;无&#34;所以??忽略了有关此事的警告。