专栏首页SAS程序分享号号号SAS-一个小程序获取某网ATC编码库~

SAS-一个小程序获取某网ATC编码库~

在临床试验中,我们经常会对合并用药进行编码,通过编码对药物归类,出频数表等,编码的字典和查询的方式很多,最近呀,小编想获取某智网站ATC编码库,但是呀,小编技术不够,所以就获取了某工网站的ATC编码相关的数据。

原理

关于获取网页信息,小编其实在很早就有写到SAS-爬取帖子下的邮箱,给他们发一封邮件...嗯,其实也就是通过获取网页代码,从网页代码中提取出需要信息~还是看一张截图(谷歌浏览器按F12即可查看也面代码)

原理就是将这些,写入到SAS数据集中,在查看需要提取的字符串出现的规律是怎么样的,然后基于规律写程序就可以了~这个主要就是看是否能发现数据的规律~不细说了,下面来上代码!

/*****************************SAS 爬取 化工ATC数据库*******************************/




*1获取首页网站ATC编码;


options nomprint nocenter nosymbolgen orientation=landscape nodate nonumber nobyline missing = ' ' nomlogic 
formchar="|----|+|---+=|-/\<>*" validvarname=upcase nofmterr
mrecall noxwait nosource nosource2  ;
options extendobscounter=no compress=yes;

option compress=yes missing='';
options nosource nosource2 nonotes nomprint;
options source source2 notes nomprint;


%macro getfirst(url=%nrstr("http://cheman.chemnet.com/atc/"),outds=%str(atc_1));

/*filename temp_sa1 url &url.;*/
data temp;
length text $20000.;
informat text $20000.;
format text $20000.;
infile &url. url DSD missover lrecl=100000000 dlm='~~~~';
input text $;
retain gp ;
order=_n_;
if text="<ul>" then tp=1;
else tp=0 ;
if _n_=1 then gp=tp;
else gp=gp+tp;
if missing(text) then delete;
run;
quit;

proc sort data=temp  out=temp  sortseq=linguistic(numeric_collation=on);by gp order ;run;
data temp2;
length text final $20000. ;
set temp;
by gp order;
retain  final;
if first.gp then final=text;
else final=cats(' ',final,text);
if compress(text)='</ul>' and gp>3 then output;
run;
data &outds.;
set temp2;
finals=tranwrd(final,'<ul>','');
finals=tranwrd(finals,'<li>','');
finals=tranwrd(finals,'</li>','');
finals=tranwrd(finals,'<a href="search.cgi?terms=','');
finals=tranwrd(finals,'&c=atc_number" class="blue fb fftt">','');
finals=compbl(tranwrd(finals,'</a',''));

ATC_CODE=strip(scan(finals,1,' '));
/*ATC_CODE=substr(final,find(final,'<a href="search.cgi?terms='),find(final,'&c=atc_number')-find(final,'<a href="search.cgi?terms='));*/
/*ATC_CODE=strip(tranwrd(ATC_CODE,'<a href="search.cgi?terms=',''));*/
ATC_EN_NAM=substr(final,find(final,'class="blue fb fftt">'),find(final,'</a>')-find(final,'class="blue fb fftt">'));
ATC_EN_NAM=strip(tranwrd(ATC_EN_NAM,'class="blue fb fftt">',''));
ATC_CN_NAM=strip(scan(finals,2,'>'));
ATC_CN_NAM=strip(scan(ATC_CN_NAM,1,'<'));
url=strip('"http://cheman.chemnet.com/atc/')||strip('search.cgi?terms=')||strip(ATC_CODE)||strip('&c=atc_number"');
keep url ATC_CODE ATC_CN_NAM  ATC_EN_NAM;
run;
quit;

proc delete data=temp temp2 ;quit;
%mend;

proc datasets library=work kill nolist;
quit;


/**/
%getfirst;

%getfirst直接调用,就是获取ATC首页的信息,因为宏中设置了宏参数的默认值...

第一层级获取了,还要获取各个层级,看网页的代码,其实很容易发现大层级跳转到子层级的规律,这个时候就可以基于规律生成一个URL,然后在通过循环一层一层的获取...

*2基于第一步获取的ATC首页信息以及内容后 进行逐条循环获取各类下的数据;



%macro getson(inds=,seq=,cod=);

%let dsid=%sysfunc(open(&inds.));
%let heve=%sysfunc(attrn(&dsid,nobs));
%let rc= %sysfunc(close(&dsid));

%put 此层级共抓取URL:&heve;
%if &heve.>0 %then %do;
data _null_;
  set &inds. end=last;
/*  if _n_=1 then */
  call execute(strip('%getfirst(url=%nrstr(')||strip(url)||strip('),outds=T&seq._')||strip(_N_)||strip(')'));
  if last then call symput('nobs',strip(_N_));
run;
quit;
data atc_&seq.;
set T&seq._1-T&seq._&nobs.;
&cod.
run;
quit;

proc delete data=T&seq._1-T&seq._&nobs.;quit;
%end;
%put **********************************************************************************;

%put Log:已经获取第 &seq. 层级数据集;

%put ***********************************************************************************;

%mend;



%getson(inds=atc_1,seq=2,cod=%str(where length(ATC_CODE)=3;))

%getson(inds=atc_2,seq=3,cod=%str(where length(ATC_CODE)=4;))
 
%getson(inds=atc_3,seq=4,cod=%str(where length(ATC_CODE)=5;))

%getson(inds=atc_4,seq=5,cod=%str(where length(ATC_CODE)=7;))

如上代码,其实也就很容易得到,ATC1-ATC5层级的数据,基于数据在进过merge等操作的整合,便能生成一个线下的编码词典库。我想,应该可以比较方便编码人员进行ATC的编码。接下来看看最终生成的ATC的Excel是啥样的。(代码写的很粗糙,有很多细节可以优化,不过呀,小编也就运行一次,目的达成了,就懒得再优化了)

基本就是这样了...

本文分享自微信公众号 - SAS程序分享号号号(xiaocgn),作者:Setup~

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SAS-可信区间的输出...

    最近小编突然发现proc freq过程步真的可以做好多事...今天打算来分享一段如何用SAS中的Proc freq过程步输出二项分布的可信区间的SAS程序...

    Setup
  • SAS-编程中的小技巧(六)

    前段时间有人问小编,批量执行ods输出文件时,总是弹出并打开输出的文件,有没有办法关闭呢?你是否也遇到这样的问题,而找遍ods相关的Option仍无法解决呢?解...

    Setup
  • SAS-爬取帖子下的邮箱,给他们发一封邮件...

    SAS中获取网页上信息的原理其实很简单,就是将网页上的html代码给导入进数据集中,然后利用一定规律来获取自己想要的提取的信息...(目前个人浅显的理解),那么...

    Setup
  • 如何实现在Excel表格中删除汉字而不破坏其他内容?

    用户1272546
  • 如何实现在Excel表格中删除汉字而不破坏其他内容?

    方法一: 先将数据复制到WORD中, 在WORD中,编辑/替换 “查找内容”输入:[一-龤]      (带中括号) “替换为”输入:/ 勾选“使用通...

    用户1191760
  • 七种回归分析方法 个个经典

    什么是回归分析? 回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关系。这种技术通常用于预测分析,时间序列模型以及发现变量之间...

    小莹莹
  • maven 手动安装本地jar包

    秋白
  • 颜值即正义!这几个库颠覆你对数据交互的想象

    作为一个对UI和动画敏感的切图仔,在日常开发之余,也会关注一些贼好看的图表库和插件。

    前端劝退师
  • 获得PHP版本信息及版本比较

    发现获取PHP的版本信息原来这么简单~~~ PHP_VERSION是一个常量,他就能获得PHP版本信息。 version_compare是一个版本比较工具,当然...

    似水的流年
  • 获得PHP版本信息及版本比较

    version_compare是一个版本比较工具,当然也可以作为其他的版本比较工具:

    似水的流年

扫码关注云+社区

领取腾讯云代金券