我目前正在使用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;
这将返回仅包含表的第一行的数据集。我已经尝试使用固定宽度和指针来设置数据集维度,但由于团队名称之类的事情的长度可能会发生很大变化,这导致数据从平面文件中错误地重新组装。
我想我大部分时间都在那里,但不能完全破解最后一点。如果有人知道我需要的确切语法会很棒。
由于
答案 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;所以??
忽略了有关此事的警告。