capture program drop songbl program songbl version 14 local cmd `0' gettoken com opt: 0, parse(",") gettoken do 0 : 0, parse(" ,") gettoken kdo opt : 0, parse(",") local ldo = length("`do'") /* di "cmd " "`cmd'" //命令 di "do " "`do'" //子命令 di "0 " "`0'" //命令-子命令 di "opt " "`opt'" // ,option di "com " "`com'" // 命令 - ,option di "kdo " "`kdo'" exit */ if "`do'" == bsubstr("cie",1,max(3,`ldo')) { songbl_cie `0' exit } else if "`do'" == bsubstr("dir",1,max(3,`ldo')) { songbl_dir `0' exit } else if "`do'" == bsubstr("ssc",1,max(3,`ldo')) { songbl_ssc `0' exit } else if "`do'" == bsubstr("excel",1,max(5,`ldo')) { songbl_excel `0' exit } else if "`do'" == bsubstr("fy",1,max(2,`ldo')) { songbl_fy `0' exit } else if "`do'" == bsubstr("get",1,max(3,`ldo')) { songbl_get `0' exit } else if "`do'" == bsubstr("ssci",1,max(2,`ldo')) { songbl_ssci `0' exit } else if "`do'" == bsubstr("paper",1,max(5,`ldo')) { songbl_paper `0' exit } else if "`do'" == bsubstr("install",1,max(7,`ldo')) { songbl_install `0' exit } else { songbl_sbl `cmd' exit } end capture program drop songbl_sbl program define songbl_sbl version 14 syntax [anything(name = class)] /// [, /// Mlink /// // - [推文标题](URL) MText /// // [推文标题](URL) MUrl /// // n. [推文标题](URL) Wlink /// // 推文标题: URL WText /// // 推文标题: URL WUrl /// // n. 推文标题: URL NOCat /// // 不呈现推文分类信息 Cls /// // 清屏后显示结果 Gap /// // 在输出的结果推文之间进行空格一行 AUTHor(string) /// // 按照推文来源进行检索。 SAVE(string) /// // 利用文档打开分享的内容。 REPLACE /// // 生成分享内容的 STATA 数据集。 Line /// // 搜索推文的另一种输出风格,具有划线 CLIP /// // 点击剪切分享,与 Wlink 搭配使用 DROP(string) /// // 删除关键词 Sou(string) /// // 删除关键词 Navigation /// // 导航功能 Num(numlist integer max=1 min=1 >0 ) /// Table /// ] * *==============================================================================* *==============================================================================* qui{ cap local class=stritrim(`"`class'"') if _rc!=0{ local class=stritrim("`class'") } tokenize `class' **# cls-option if "`cls'" != ""{ cls n dis "" } **# gap-option if "`gap'" != "" { local gap dis "" local gap1 post songbl_post ("" ) } **# sou-option if "`sou'"!=""{ tokenize `sou' local 1=ustrleft("`1'",1) if strmatch("计量圈","*`1'*")==1 | "`sou'"=="q"{ view browse "https://data.newrank.cn/m/s.html?s=OjAqNjI2LjxI&k=`class'" exit } else if strmatch("百度","*`1'*")==1 | "`sou'"=="b"{ view browse "https://www.baidu.com/s?&wd=`class'" exit } else if strmatch("微信公众号","*`1'*")==1 | "`sou'"=="w"{ view browse "https://weixin.sogou.com/weixin?type=2&query=`class'" exit } else if strmatch("经管之家","*`1'*")==1 | "`sou'"=="j"{ view browse "http://sou.pinggu.org/cse/search?q=`class'&s=4433512227215735158&nsid=0" exit } else if strmatch("知乎","*`1'*")==1 | "`sou'"=="z"{ view browse "https://www.zhihu.com/search?type=content&q=`class'" exit } else if strmatch("全部","*`1'*")==1 | "`sou'"=="all" { view browse "https://data.newrank.cn/m/s.html?s=OjAqNjI2LjxI&k=`class'" view browse "https://www.baidu.com/s?&wd=`class'" view browse "https://weixin.sogou.com/weixin?type=2&query=`class'" view browse "http://sou.pinggu.org/cse/search?q=`class'&s=4433512227215735158&nsid=0" view browse "https://www.zhihu.com/search?type=content&q=`class'" exit } else { dis as error `" (`sou') 不是正确的搜索来源,仅包括计量圈、百度、微信公众号、经管之家、知乎"' dis as text _n `" 试试:"' dis as text _col(5)`" {stata " songbl `class',s(计量圈) "} 或 {stata " songbl `class',s(百度) "}"' dis as text _col(5)`" {stata " songbl `class',s(公众号) "} 或 {stata " songbl `class',s(知乎) "}"' _n dis as text _col(5)`" {stata " songbl `class',s(经管家) "} 或 {stata " songbl `class',s(全部) "}"' _n exit } exit } **# Navigation-option //动态导航功能设置 local path https://songbl-1304948727.cos.ap-guangzhou.myqcloud.com local URL "`path'/navigation" if "`class'"=="" { n songbl_links ,url(`URL'/songbl.txt) exit } if "`class'"=="data"{ n songbl_links ,url(`URL'/data.txt) exit } if "`class'"=="sj"{ n songbl_links1 ,url(`URL'/sj.txt) exit } if "`class'"=="happy"{ n songbl_links ,url(`URL'/happy.txt) exit } if "`class'"=="zw"{ n songbl_links1 , url(`URL'/zw.txt) exit } if "`class'"=="paper"{ n songbl_links1 ,url(`URL'/paper.txt) exit } if "`class'"=="stata"{ n songbl_links1 , url(`URL'/stata.txt) exit } if "`class'"=="all"{ n songbl_links1 , url(`URL'/all.txt) exit } //批量获取导航链接 if "`navigation'"!=""{ tempfile html_text cap copy `"`URL'/link.txt"' `"`html_text'.txt"', replace local times = 0 while _rc ~= 0 { local times = `times' + 1 sleep 1000 cap copy `"`URL'"' `"`html_text'.txt"', replace if `times' > 2 { disp as error "Internet speeds is too low to get the data" exit 601 } } infix strL v 1-100000 using `"`html_text'.txt"', clear cap erase `"`html_text'.txt"' split v, p("++") keep v1 v2 v3 local o_class= "`class'" levelsof v1 , clean if strmatch("`r(levels)'","*`class'*")==0{ dis as error `" 导航格式错误"' dis as error `" 查看导航目录:{stata "songbl all"}"' exit 601 } local N=_N forvalues i =1/`N'{ local v1_`i'=v1[`i'] local v2_`i'=v2[`i'] local v3_`i'=v3[`i'] if "`class'"=="`v1_`i''"{ local URL "`v3_`i''" `v2_`i'' , url(`URL') exit } } exit } **# replace-option if ("`replace'"=="") { preserve } // 避免变量与用户变量冲突 clear //推文链接与标题 local path https://songbl-1304948727.cos.ap-guangzhou.myqcloud.com local url "`path'/songbl/songbl.txt" tempfile html_text html_text_dta html_text_seminar_paper_dta Share_txt songbl_post capture copy `"`url'"' `"`html_text'.txt"', replace local times = 0 while _rc ~= 0 { local times = `times' + 1 sleep 1000 capture copy `"`stata_paper_youdao'"' `"`html_text'.txt"', replace if `times' > 3 { disp as error "Internet speeds is too low to get the data" exit 601 } } infix strL v 1-100000 using `"`html_text'.txt"', clear capture erase `"`html_text'.txt"' //文本分割 split v,p("++") if _rc ~= 0 { di as err "Failed to get the data" exit 601 } //链接 标题 内容分类 作者 形式分类 日期 rename (v1-v6) (link title style type seminar_paper date) //推文作者排序 gen type2=. replace type2=1 if type=="连享会" replace type2=2 if type=="学术论文" replace type2=3 if type=="论文代码" replace type2=4 if type=="do文档" replace type2=5 if type=="微信公众号" replace type2=6 if type=="爬虫俱乐部" replace type2=7 if type=="经管之家" replace type2=8 if type=="简书" replace type2=9 if type=="知乎" replace type2=10 if type=="B站" replace type2=11 if type=="新浪博客" replace type2=12 if type=="Stata书籍" replace type2=13 if type=="其他类型" //后续检索关键词不区分大小写 gen title1 = lower(title) gen style1 = lower(style) gen text =title1+" "+style1 gen ad = strmatch(type,"*songbl*") drop if strmatch(seminar_paper,"*advert*")==1 drop if strmatch(type,"*ad*")==1 replace seminar_paper="推文" if seminar_paper=="专题" //获取一些链接 local link_row1 = link[1] *local new_title =title[1] *local search_link =link[2] drop if seminar_paper=="" local Verion=usubinstr("`link_row1'","Verion","",.) if `Verion'>=2.2{ di as error "系统发现 {bf:{it:songbl}} 命令有更新,同意更新请输入:{bf:Y} ,否则输入:{bf:N} _____" _request(updatesongbl) if "$updatesongbl"=="Y"{ songbl install songbl,replace n dis as txt "更新完毕!" n dis "请输入:" `"{stata "clear all":clear all }"' "清除内存中的旧程序,否则会重复更新" exit } else if "$updatesongbl"=="N"{ n dis as txt "旧版本已经停止服务,请及时更新" exit } else{ n dis as txt "输入错误,请输入大写 Y 或 N " exit 100 } } **# author-option keep if strmatch(type,"*`author'*")==1 **# drop-option foreach class_drop of local drop{ drop if strmatch(text,"*`class_drop'*") } **# 筛选关键词 //输入1个关键词 if "`1'"!="" & "`2'"=="" { if "`class'"=="new"{ if "`num'"==""{ local num=10 } sort date type style title drop if title=="new_songbl" drop in 1 drop if seminar_paper=="论文" drop if type=="songbl" cap keep in -`num'/ -1 } else{ capture local 1 = strlower(`"`1'"') if _rc!=0{ local 1 = strlower("`1'") } capture gen yjy1 = strmatch(text,`"*`1'*"') if _rc!=0{ gen yjy1 = strmatch(text,"*`1'*") } keep if yjy1==1 | ad==1 } } //输入两个及以上关键词 else{ if strmatch("`class'","*+*")==1 & strmatch("`class'","*-*")==1{ dis as error `" "+" 或者 "-" 号不能同时选择"' exit 198 } if strmatch(`"`class'"',"*+*")==1{ local class_new = subinstr(`"`class'"',"+"," ",.) tokenize `class_new' local wordn = wordcount("`class_new'") forvalues i = 1/`wordn'{ local `i' = strlower(`"``i''"') gen yjy`i' = strmatch(text,`"*``i''*"') } capture egen yjy=rowtotal(yjy*) if _rc!=0{ dis as error `" songbl : invalid songbl type"' exit 198 } keep if yjy>=1|ad==1 } else if strmatch(`"`class'"',"*-*")==1{ local class_new = subinstr(`"`class'"',"-"," ",.) tokenize `class_new' local wordn = wordcount("`class_new'") forvalues i = 1/`wordn'{ local `i' = strlower(`"``i''"') gen yjy`i' = strmatch(text,`"*``i''*"') } capture egen yjy=rowtotal(yjy*) if _rc!=0{ dis as error `" songbl : invalid songbl type"' exit 198 } keep if (yjy1==1 & yjy==1) | ad==1 } else{ local class_new = subinstr(`"`class'"',"-"," ",.) tokenize `class_new' local wordn = wordcount(`"`class_new'"') forvalues i = 1/`wordn'{ local `i' = strlower(`"``i''"') gen yjy`i' = strmatch(text,`"*``i''*"') } capture egen yjy=rowtotal(yjy*) if _rc!=0{ dis as error `" songbl : invalid songbl type"' exit 198 } keep if yjy==`wordn'| ad==1 } } local n =_N local ad =ad[1] count if ad==1 local coun_ad=`n'-`r(N)' n if `coun_ad'<=0{ dis as error `" {bf:抱歉,没有找到与 [ {it:`class'} ] 相关的内容。}"' _n dis as red `" 试试:{stata "songbl":[分类查看推文]}"' `" 或者 {stata "h songbl_cn":[查看帮助文档]}"' _n dis as text `" 或者试试网页搜索:"' dis as text _col(5)`" {stata " songbl `*',s(计量圈) "} 或 {stata " songbl `*',s(百度) "}"' dis as text _col(5)`" {stata " songbl `*',s(公众号) "} 或 {stata " songbl `*',s(知乎) "}"' dis as text _col(5)`" {stata " songbl `*',s(经管家) "} 或 {stata " songbl `*',s(全部) "}"' _n dis as red `" 或者试试检索代码:{stata "songbl `*',cie"}"' _n dis as text `" 如果您发现{bf:songbl}命令的使用bug,或者对{bf:songbl}命令的改善有什么建议"' dis as text `" 您可以通过以下链接填写资料告知我们"' dis as error `" {bf:点击链接:}"' dis as text _col(8) `" ({browse "https://www.wjx.top/vm/ekn2Nl0.aspx":https://www.wjx.top/vm/ekn2Nl0.aspx})"' dis "" exit } **# 关键词打印 if "`table'"!=""{ local start: disp %dCYND date("`c(current_date)'","DMY") local year = substr("`start'",1,4) local month = substr("`start'",5,2) local day = substr("`start'",7,2) local cur_time "`year'""年""`month'""月""`day'""日" if "`num'"==""{ local num=10 } sort date type style title local n =_N local all_n=_N n dis as text _skip(45) "{bf:Hello, Songbl Stata}" _n if `num'>`all_n'{ n dis as text _col(4) "以下为全部`author'推文:共`all_n'篇" _col(88) "`year'-`month'-`day' `c(current_time)'" } else{ n dis as text _col(4) "以下为`all_n'篇`author'{bf:`class'}推文" _col(88) "`year'-`month'-`day' `c(current_time)'" } n dis as txt "{hline 135} " n dis in text _col(4) "{bf:Url}" _col(12) "{bf:Model}" _col(29) `"{bf:Author}"' _col(45) `"{bf:Type}"' _col(60) `"{bf:Date}"' _col(75) `"{bf:Title}"' n dis as txt "{hline 135} " n `gap' forvalues i = 1/`n' { local link=link[`i'] local title=title[`i'] local type=type[`i'] local style=style[`i'] local seminar_paper =seminar_paper[`i'] local date =date[`i'] if strmatch(`"`link'"',"* *")==1{ n dis _col(5) `"{stata `"`link'"':-}"' _col(9) `"{stata songbl `style',table: `style'}"' /// _col(29) `"`type'"' _col(45) `"`seminar_paper'"' _skip(8) `"`date'"' _skip(8) `"`title'"' } else { n dis _col(5) `"{browse `"`link'"':-}"' _col(9) `"{stata songbl `style',table: `style'}"' /// _col(29) `"`type'"' _col(45) `"`seminar_paper'"' _skip(8) `"`date'"' _skip(8) `"`title'"' } if "`line'"!=""{ n `gap' n dis as txt "{hline 135} " } n `gap' } if "`line'"==""{ n dis as txt "{hline 135} " } n dis as text _col(3) `"{stata songbl 公告: (Songbl平台公告与资源上传)}"' _n cap drop if strmatch(`"link,"* *") if "`mlink'" !="" | "`mtext'" !="" | "`murl'" !=""{ capture postclose songbl_post postfile songbl_post str1000 Share using "`songbl_post'", replace local all_n=_N post songbl_post (`"####
songbl命令中`all_n'篇`author'`class'推文
"') post songbl_post (`" Model | Author |Type |Date | Title"') n dis as text `"####
songbl命令中`all_n'篇`author'`class'推文
"' n dis as text `" Model | Author |Type |Date | Title"' post songbl_post (`":---|:---|:---|:---|:---"') n dis as text `":---|:---|:---|:---|:---"' *local n =_N forvalues i = 1/`n' { local link=link[`i'] local title=title[`i'] local type=type[`i'] local style=style[`i'] local seminar_paper =seminar_paper[`i'] local date =date[`i'] n dis as text `"`style'|`type'|`seminar_paper'|`date'|[`title'](`link')"' post songbl_post (`"`style'|`type'|`seminar_paper'|`date'|[`title'](`link')"') } postclose songbl_post use "`songbl_post'", clear if ("`replace'"!="") { capture format %-200s Share br } if ("`save'"!="") { capture format %-200s Share export delimited Share using "`Share_txt'.`save'" , /// novar nolabel delimiter(tab) replace view browse "`Share_txt'.`save'" } } exit } else if "`wlink'" =="" & "`wtext'"=="" & "`mlink'"=="" & "`mtext'"=="" & "`murl'"=="" & "`wurl'"=="" { //保存关键词 "class" 搜索到的数据 save "`html_text_dta'",replace levelsof seminar_paper,local(seminar_paper) foreach seminar_paper in `seminar_paper'{ use "`html_text_dta'",clear keep if seminar_paper==`"`seminar_paper'"' save "`html_text_seminar_paper_dta'",replace levelsof style,local(number) foreach num in `number' { use "`html_text_seminar_paper_dta'",clear keep if style=="`num'" local n=_N if `n'>0{ sort type2 title if missing("`nocat'"){ n dis as w `" `seminar_paper' >>"' `"{stata "songbl `num'": `num'}"' } forvalues i = 1/`n'{ local link=link[`i'] local title=title[`i'] capture dis strmatch(`"`link'"',"* *")==1 if _rc==0{ if strmatch(`"`link'"',"* *")==1{ n dis _col(4) `"{stata `"`link'"': `title'}"' } else{ n dis _col(4) `"{browse `"`link'"': `title'}"' } } else{ if strmatch("`link'","* *")==1{ n dis _col(4) `"{stata `"`link'"': `title'}"' } else{ n dis _col(4) `"{browse `"`link'"': `title'}"' } } n `gap' } } if missing("`nocat'"){ n dis "" } } } if "`save'"!="" { dis as error `" 命令格式有误,see { stata " help songbl_cn" }"' dis as error `" Note:save 选择项必须与 wlink 、wtext 、mlink 、mtext、murl、wurl 等分享功能一起使用 "' exit 198 } use "`html_text_dta'", clear } else{ if "`mlink'" !="" | "`mtext'" !="" | "`murl'" !=""{ drop if strmatch(link,`"* *"')==1 } save "`html_text_dta'", replace // 保存关键词 "class" 搜索到的数据 capture postclose songbl_post postfile songbl_post str1000 Share using "`songbl_post'", replace **# wlink-option if "`wlink'" !=""{ n dis "" n dis as txt _n "{hline 24} wlink文本格式 {hline 24}" n dis as txt n dis as res "* 以下内容由 -songbl- 命令生成,安装命令:ssc install songbl,replace" n dis as res "* 查看更多内容请在 Stata 窗口输入代码:songbl `class'" post songbl_post ("* 以下内容由 -songbl- 命令生成,安装命令:ssc install songbl,replace") post songbl_post ("* 查看更多内容请在 Stata 窗口输入代码:songbl `class'") n dis as txt post songbl_post (" ") levelsof seminar_paper,local(seminar_paper) local m=_N foreach seminar_paper in `seminar_paper' { use "`html_text_dta'", clear keep if seminar_paper==`"`seminar_paper'"' save "`html_text_seminar_paper_dta'", replace levelsof style,local(number) foreach num in `number'{ use "`html_text_seminar_paper_dta'", clear keep if style=="`num'" local n=_N if `n'>0{ sort type2 title if missing("`nocat'"){ n dis as w _col(4) " `seminar_paper' >>"`"{stata "songbl `num'": `num'}"'" n `gap' `gap1' post songbl_post (" `seminar_paper' >> `num'" ) } forvalues i = 1/`n' { local link=link[`i'] local title=title[`i'] cap di wordcount(`"`title': `link'"') if _rc==0{ post songbl_post (`"`title': `link'"') } if "`clip'"==""{ n dis as y `"`title': `link'"' } else{ local clip1 `"`title': `link'"' local clip2 `"`title': `link'"' n dis `"{stata `"!echo `clip1' Copy by #公众号:songbl | clip"': `clip2'}"' } n `gap' `gap1' } } if missing("`nocat'"){ n dis "" post songbl_post (" " ) } } } n dis "" n dis as txt "{hline 24} 分享复制以上内容 {hline 24}" n dis as red "{bf:小提示:}" `"使用 {stata `"songbl `class', w clip "':songbl `class', w clip} 后,"' "点击超链接,按Ctrl+V可进行粘贴" n dis as red " 建议分多次复制到微信对话框,每次 10 行,否则超链接无法生效" n dis as red " 长链接断行导致打印失败。请使用" `" {stata `"songbl `class',w replace"':songbl `class', w replace }"' "或者" `" {stata `"songbl `class',w save(txt)"':songbl `class',w save(txt)}"' } **# wtext-option if "`wtext'" !=""{ n dis "" n dis as txt _n "{hline 24} wtxt文本格式 {hline 24}" n dis as txt n dis as res "* 以下内容由 -songbl- 命令生成,安装命令:ssc install songbl,replace" n dis as res "* 查看更多内容请在 Stata 窗口输入代码:songbl `class'" post songbl_post ("* 以下内容由 -songbl- 命令生成,安装命令:ssc install songbl,replace") post songbl_post ("* 查看更多内容请在 Stata 窗口输入代码:songbl `class'") n dis as txt post songbl_post (" ") use "`html_text_dta'", clear levelsof seminar_paper , local(seminar_paper) local m=_N foreach seminar_paper in `seminar_paper' { use "`html_text_dta'", clear keep if seminar_paper==`"`seminar_paper'"' save "`html_text_seminar_paper_dta'", replace levelsof style,local(number) foreach num in `number'{ use "`html_text_seminar_paper_dta'", clear keep if style=="`num'" local n=_N if `n'>0{ sort type2 title if missing("`nocat'"){ n dis as w _col(4) " `seminar_paper' >>"`"{stata "songbl `num'": `num'}"'" post songbl_post (" `seminar_paper' >> `num'" ) n `gap' `gap1' } forvalues i = 1/`n'{ local link=link[`i'] local title=title[`i'] cap di wordcount(`"`title': `link'"') if _rc==0{ n dis as text `"`title'"' n dis as text `"`link'"' post songbl_post (`"`title'"') post songbl_post (`"`link'"') } n `gap' `gap1' } } if missing("`nocat'"){ post songbl_post (" " ) n dis "" } } } n dis "" n dis as txt "{hline 24} 分享复制以上内容 {hline 24}" n dis as red "{bf:小提示:}多条长链接直接复制会断行。建议使用" `" {stata `"songbl `class',wt replace"':songbl `class',wt replace }"' "或者" `" {stata `"songbl `class',wt save(txt)"':songbl `class',wt save(txt)}"' } **# wurl-option if "`wurl'" !=""{ n dis "" n dis as txt _n "{hline 24} wurl文本格式 {hline 24}" n dis as txt n dis as res "* 以下内容由 -songbl- 命令生成,安装命令:ssc install songbl,replace" n dis as res "* 查看更多内容请在 Stata 窗口输入代码:songbl `class'" post songbl_post ("* 以下内容由 -songbl- 命令生成,安装命令:ssc install songbl,replace") post songbl_post ("* 查看更多内容请在 Stata 窗口输入代码:songbl `class'") n dis as txt post songbl_post (" ") use "`html_text_dta'", clear levelsof seminar_paper , local(seminar_paper) local m=_N foreach seminar_paper in `seminar_paper' { use "`html_text_dta'", clear keep if seminar_paper==`"`seminar_paper'"' save "`html_text_seminar_paper_dta'", replace levelsof style , local(number) foreach num in `number' { use "`html_text_seminar_paper_dta'", clear keep if style=="`num'" local n=_N if `n'>0{ sort type2 title if missing("`nocat'"){ n dis as w _col(4) " `seminar_paper' >>"`"{stata "songbl `num'": `num'}"'" post songbl_post (" `seminar_paper' >> `num'" ) n `gap' `gap1' } forvalues i = 1/`n' { local link=link[`i'] local title=title[`i'] cap di wordcount(`"`title': `link'"') if _rc==0{ if `n'==1{ n dis as text `"`title': `link'"' post songbl_post (`"`title': `link'"') } else { n dis as text `"`i'. `title': `link'"' post songbl_post (`"`i'. `title': `link'"') } } n `gap' `gap1' } } if missing("`nocat'"){ post songbl_post (" " ) n dis "" } } } n dis "" n dis as txt "{hline 24} 分享复制以上内容 {hline 24}" n dis as red "{bf:小提示:}多条长链接直接复制会断行。建议使用" `" {stata `"songbl `class',wu replace"':songbl `class',wu replace }"' "或者" `" {stata `"songbl `class',wu save(txt)"':songbl `class',wu save(txt)}" } **# mlink-option if "`mlink'" !=""{ n dis "" n dis as txt _n "{hline 24} mlik文本格式 {hline 24}" n dis as txt n dis as res "> 以下内容由 -songbl- 命令生成,安装命令:**ssc install songbl,replace**" n dis as res "> 查看更多内容请在 Stata 窗口输入代码:**songbl `class'**" post songbl_post ("#
`class'
") post songbl_post ("**以下推文列表由 **lianxh** 与 **songbl** 命令生成**") post songbl_post ("```") post songbl_post ("Note:产生如下推文列表的 Stata 命令为:") post songbl_post (". lianxh `class'") post songbl_post (". songbl `class'") post songbl_post ("安装最新版 lianxh/songbl命令:") post songbl_post (". ssc install lianxh, replace ") post songbl_post (". ssc install songbl, replace") post songbl_post ("```") post songbl_post ("---") n dis as txt "---" use "`html_text_dta'",clear levelsof seminar_paper , local(seminar_paper) local m=_N foreach seminar_paper in `seminar_paper'{ use "`html_text_dta'", clear keep if seminar_paper==`"`seminar_paper'"' save "`html_text_seminar_paper_dta'", replace levelsof style , local(number) foreach num in `number'{ use "`html_text_seminar_paper_dta'", clear keep if style=="`num'" local n=_N if `n'>0{ sort type2 title if missing("`nocat'"){ n dis as w _col(4) "### `seminar_paper' >>"`"{stata "songbl `num'": `num'}"'" post songbl_post ("### `seminar_paper' >> `num'" ) n `gap' `gap1' } forvalues i = 1/`n' { local link=link[`i'] local title=title[`i'] cap di wordcount(`"`title': `link'"') if _rc==0{ n dis as text `"- [`title'](`link')"' post songbl_post (`"- [`title'](`link')"') } n `gap' `gap1' } } if missing("`nocat'"){ post songbl_post (" " ) n dis "" } } } post songbl_post ("## **Stata** 交流群微信:songbl_stata") n dis "" n dis as txt "{hline 24} 分享复制以上内容 {hline 24}" n dis as red "{bf:小提示:}多条长链接直接复制会断行。建议使用:" `" {stata `"songbl `class',m replace"':songbl `class',m replace }"' n dis as red _col(9) "利用" `"{browse "https://editor.mdnice.com/": Mdnice }"' "编辑器输出PDF格式" `" {stata `"songbl `class',m save(txt)"': songbl `class',m save(txt)}"' } **# mtext-option if "`mtext'" !=""{ n dis "" n dis as txt _n "{hline 24} mtext文本格式 {hline 24}" n dis as txt n dis as res "> 以下内容由 -songbl- 命令生成,安装命令:**ssc install songbl,replace**" n dis as res "> 查看更多内容请在 Stata 窗口输入代码:**songbl `class'**" post songbl_post ("#
`class'
") post songbl_post ("**以下推文列表由 **lianxh** 与 **songbl** 命令生成**") post songbl_post ("```") post songbl_post ("Note:产生如下推文列表的 Stata 命令为:") post songbl_post (". lianxh `class'") post songbl_post (". songbl `class'") post songbl_post ("安装最新版 lianxh/songbl命令:") post songbl_post (". ssc install lianxh, replace ") post songbl_post (". ssc install songbl, replace") post songbl_post ("```") n dis as txt "---" post songbl_post ("---") use "`html_text_dta'", clear levelsof seminar_paper,local(seminar_paper) local m=_N foreach seminar_paper in `seminar_paper'{ use "`html_text_dta'", clear keep if seminar_paper==`"`seminar_paper'"' save "`html_text_seminar_paper_dta'",replace levelsof style,local(number) foreach num in `number' { use "`html_text_seminar_paper_dta'",clear keep if style=="`num'" local n=_N if `n'>0{ sort type2 title if missing("`nocat'"){ n dis as w _col(4) "### `seminar_paper' >>"`"{stata "songbl `num'": `num'}"'" post songbl_post ("### `seminar_paper' >> `num'" ) n `gap' `gap1' } forvalues i = 1/`n' { local link=link[`i'] local title=title[`i'] cap di wordcount(`"`title': `link'"') if _rc==0{ n dis as text `"[`title'](`link')"' post songbl_post (`"[`title'](`link')"') } n `gap' `gap1' } } if missing("`nocat'"){ post songbl_post (" " ) n dis "" } } } post songbl_post ("## **Stata** 交流群微信:songbl_stata") n dis "" n dis as txt "{hline 24} 分享复制以上内容 {hline 24}" n dis as red "{bf:小提示:}多条长链接直接复制会断行。建议使用:" `" {stata `"songbl `class',mt replace"':songbl `class',mt replace }"' n dis as red _col(9) "利用" `"{browse "https://editor.mdnice.com/": Mdnice }"' "编辑器输出PDF格式" `" {stata `"songbl `class',mt save(txt)"': songbl `class',mt save(txt)}"' } **# murl-option if "`murl'" !=""{ n dis "" n dis as txt _n "{hline 24} murl文本格式 {hline 24}" n dis as txt n dis as res "> 以下内容由 -songbl- 命令生成,安装命令:**ssc install songbl,replace**" n dis as res "> 查看更多内容请在 Stata 窗口输入代码:**songbl `class'**" post songbl_post ("#
`class'
") post songbl_post ("**以下推文列表由 **lianxh** 与 **songbl** 命令生成**") post songbl_post ("```") post songbl_post ("Note:产生如下推文列表的 Stata 命令为:") post songbl_post (". lianxh `class'") post songbl_post (". songbl `class'") post songbl_post ("安装最新版 lianxh/songbl命令:") post songbl_post (". ssc install lianxh, replace ") post songbl_post (". ssc install songbl, replace") post songbl_post ("```") n dis as txt "---" post songbl_post ("---") use "`html_text_dta'", clear levelsof seminar_paper,local(seminar_paper) local m=_N foreach seminar_paper in `seminar_paper'{ use "`html_text_dta'", clear keep if seminar_paper==`"`seminar_paper'"' save "`html_text_seminar_paper_dta'",replace levelsof style,local(number) foreach num in `number' { use "`html_text_seminar_paper_dta'",clear keep if style=="`num'" local n=_N if `n'>0{ sort type2 title if missing("`nocat'"){ n dis as w _col(4) "### `seminar_paper' >>"`"{stata "songbl `num'": `num'}"'" post songbl_post ("### `seminar_paper' >> `num'" ) n `gap' `gap1' } forvalues i = 1/`n' { local link=link[`i'] local title=title[`i'] cap di wordcount(`"`title': `link'"') if _rc==0{ if `n'==1{ n dis "" n dis as text `"[`title'](`link')"' post songbl_post ("") post songbl_post (`"[`title'](`link')"') } else { n dis as text `"`i'. [`title'](`link')"' post songbl_post (`"`i'. [`title'](`link')"') } } n `gap' `gap1' } } if missing("`nocat'"){ post songbl_post (" " ) n dis "" } } } post songbl_post ("## **Stata** 交流群微信:songbl_stata") n dis "" n dis as txt "{hline 24} 分享复制以上内容 {hline 24}" n dis as red "{bf:小提示:}多条长链接直接复制会断行。建议使用:" `" {stata `"songbl `class',mu replace"':songbl `class',mu replace }"' n dis as red _col(9) "利用" `"{browse "https://editor.mdnice.com/": Mdnice }"' "编辑器输出PDF格式" `" {stata `"songbl `class',mu save(txt)"': songbl `class',mu save(txt)}"' } postclose songbl_post use "`songbl_post'", clear cap format %-200s Share } if ("`replace'"!="") { cap keep link title style type seminar_paper cap label variable link "链接" cap label variable title "标题" cap label variable style "分类" cap label variable type "来源" cap label variable seminar_paper "论文 or 推文" cap label variable data "更新时间" } **# save-option if ("`save'"!="") { export delimited Share using "`Share_txt'.`save'" , /// novar nolabel delimiter(tab) replace view browse "`Share_txt'.`save'" } cap erase `"`html_text'.txt"' if ("`replace'"=="") { restore } } end capture program drop songbl_ssci program define songbl_ssci version 14 syntax [anything(name = class)][,Cls Gap DROP(string) Sou(string)] * *==============================================================================* *==============================================================================* qui{ cap local class=stritrim(`"`class'"') if _rc!=0{ local class=stritrim("`class'") } tokenize `class' **# cls-option if "`cls'" != ""{ cls n dis "" } **# gap-option if "`gap'" != "" { local gap dis "" } if "`class'" == ""{ n songbl SSCI期刊 exit } **# sou-option if "`sou'"!=""{ tokenize `sou' local 1=ustrleft("`1'",1) if strmatch("计量圈","*`1'*")==1 | "`sou'"=="q"{ view browse "https://data.newrank.cn/m/s.html?s=OjAqNjI2LjxI&k=`class'" exit } else if strmatch("百度","*`1'*")==1 | "`sou'"=="b"{ view browse "https://www.baidu.com/s?&wd=`class'" exit } else if strmatch("微信公众号","*`1'*")==1 | "`sou'"=="w"{ view browse "https://weixin.sogou.com/weixin?type=2&query=`class'" exit } else if strmatch("经管之家","*`1'*")==1 | "`sou'"=="j"{ view browse "http://sou.pinggu.org/cse/search?q=`class'&s=4433512227215735158&nsid=0" exit } else if strmatch("知乎","*`1'*")==1 | "`sou'"=="z"{ view browse "https://www.zhihu.com/search?type=content&q=`class'" exit } else if strmatch("全部","*`1'*")==1 | "`sou'"=="all" { view browse "https://data.newrank.cn/m/s.html?s=OjAqNjI2LjxI&k=`class'" view browse "https://www.baidu.com/s?&wd=`class'" view browse "https://weixin.sogou.com/weixin?type=2&query=`class'" view browse "http://sou.pinggu.org/cse/search?q=`class'&s=4433512227215735158&nsid=0" view browse "https://www.zhihu.com/search?type=content&q=`class'" exit } else { dis as error `" (`sou') 不是正确的搜索来源,仅包括计量圈、百度、微信公众号、经管之家、知乎"' dis as text _n `" 试试:"' dis as text _col(5)`" {stata " songbl `class',s(计量圈) "} 或 {stata " songbl `class',s(百度) "}"' dis as text _col(5)`" {stata " songbl `class',s(公众号) "} 或 {stata " songbl `class',s(知乎) "}"' _n dis as text _col(5)`" {stata " songbl `class',s(经管家) "} 或 {stata " songbl `class',s(全部) "}"' _n exit } exit } preserve // 避免变量与用户变量冲突 clear //推文链接与标题 local path https://songbl-1304948727.cos.ap-guangzhou.myqcloud.com local url "`path'/songbl/ssci.txt" tempfile html_text html_text_dta html_text_seminar_paper_dta capture copy `"`url'"' `"`html_text'.txt"', replace local times = 0 while _rc ~= 0 { local times = `times' + 1 sleep 1000 capture copy `"`stata_paper_youdao'"' `"`html_text'.txt"', replace if `times' > 3 { disp as error "Internet speeds is too low to get the data" exit 601 } } infix strL v 1-100000 using `"`html_text'.txt"', clear capture erase `"`html_text'.txt"' //文本分割 split v,p("++") if _rc ~= 0 { di as err "Failed to get the data" exit 601 } local start: disp %dCYND date("`c(current_date)'","DMY") local year = substr("`start'",1,4) local month = substr("`start'",5,2) local day = substr("`start'",7,2) local cur_time "`year'""年""`month'""月""`day'""日" capture confirm v6 if _rc!=0{ gen v6 ="`year'"+"/"+"`mouth'"+"/"+"`day'" } //链接 标题 内容分类 作者 形式分类 日期 rename (v1-v6) (link title style type seminar_paper date) //后续检索关键词不区分大小写 gen title1 = lower(title) gen style1 = lower(style) gen text =title1+" "+style1 gen ad = strmatch(type,"*置顶*") drop if strmatch(seminar_paper,"*advert*")==1 drop if strmatch(type,"*ad*")==1 **# drop-option foreach class_drop of local drop{ drop if strmatch(text,"*`class_drop'*") } **# 筛选关键词 //输入1个关键词 if "`1'"!="" & "`2'"=="" { capture local 1 = strlower(`"`1'"') if _rc!=0{ local 1 = strlower("`1'") } capture gen yjy1 = strmatch(text,`"*`1'*"') if _rc!=0{ gen yjy1 = strmatch(text,"*`1'*") } keep if yjy1==1 | ad==1 } //输入两个及以上关键词 else{ if strmatch("`class'","*+*")==1 & strmatch("`class'","*-*")==1{ dis as error `" "+" 或者 "-" 号不能同时选择"' exit 198 } if strmatch(`"`class'"',"*+*")==1{ local class_new = subinstr(`"`class'"',"+"," ",.) tokenize `class_new' local wordn = wordcount("`class_new'") forvalues i = 1/`wordn'{ local `i' = strlower(`"``i''"') gen yjy`i' = strmatch(text,`"*``i''*"') } capture egen yjy=rowtotal(yjy*) if _rc!=0{ dis as error `" songbl ssci : invalid songbl ssci type"' exit 198 } keep if yjy>=1|ad==1 } else if strmatch(`"`class'"',"*-*")==1{ local class_new = subinstr(`"`class'"',"-"," ",.) tokenize `class_new' local wordn = wordcount("`class_new'") forvalues i = 1/`wordn'{ local `i' = strlower(`"``i''"') gen yjy`i' = strmatch(text,`"*``i''*"') } capture egen yjy=rowtotal(yjy*) if _rc!=0{ dis as error `" songbl ssci : invalid songbl ssci type"' exit 198 } keep if (yjy1==1 & yjy==1) | ad==1 } else{ local class_new = subinstr(`"`class'"',"-"," ",.) tokenize `class_new' local wordn = wordcount(`"`class_new'"') forvalues i = 1/`wordn'{ local `i' = strlower(`"``i''"') gen yjy`i' = strmatch(text,`"*``i''*"') } capture egen yjy=rowtotal(yjy*) if _rc!=0{ dis as error `" songbl ssci : invalid songbl ssci type"' exit 198 } keep if yjy==`wordn'| ad==1 } } local n =_N local ad =ad[1] count if ad==1 local coun_ad=`n'-`r(N)' n if `coun_ad'<=0{ dis as error `" {bf:抱歉,没有找到与 [ {it:`class'} ] 相关的内容。}"' _n dis as red `" 试试:{stata "songbl":[分类查看推文]}"' `" 或者 {stata "h songbl_cn":[查看帮助文档]}"' _n dis as text `" 或者试试网页搜索:"' dis as text _col(5)`" {stata " songbl `*',s(计量圈) "} 或 {stata " songbl `*',s(百度) "}"' dis as text _col(5)`" {stata " songbl `*',s(公众号) "} 或 {stata " songbl `*',s(知乎) "}"' dis as text _col(5)`" {stata " songbl `*',s(经管家) "} 或 {stata " songbl `*',s(全部) "}"' _n dis as red `" 或者试试检索代码:{stata "songbl cie `*'"}"' _n dis as text `" 如果您发现{bf:songbl}命令的使用bug,或者对{bf:songbl}命令的改善有什么建议"' dis as text `" 您可以通过以下链接填写资料告知我们"' dis as error `" {bf:点击链接:}"' dis as text _col(8) `" ({browse "https://www.wjx.top/vm/ekn2Nl0.aspx":https://www.wjx.top/vm/ekn2Nl0.aspx})"' dis "" exit } **# 关键词打印 save "`html_text_dta'",replace levelsof seminar_paper,local(seminar_paper) foreach seminar_paper in `seminar_paper'{ use "`html_text_dta'",clear keep if seminar_paper==`"`seminar_paper'"' save "`html_text_seminar_paper_dta'",replace levelsof style,local(number) foreach num in `number' { use "`html_text_seminar_paper_dta'",clear keep if style=="`num'" local n=_N if `n'>0{ sort title if missing("`nocat'"){ n dis as w `" `seminar_paper' >>"' `"{stata "songbl ssci `num'": `num'}"' } forvalues i = 1/`n'{ local link=link[`i'] local title=title[`i'] capture dis strmatch(`"`link'"',"* *")==1 if _rc==0{ if strmatch(`"`link'"',"* *")==1{ n dis _col(4) `"{stata `"`link'"': `title'}"' } else{ n dis _col(4) `"{browse `"`link'"': `title'}"' } } else{ if strmatch("`link'","* *")==1{ n dis _col(4) `"{stata `"`link'"': `title'}"' } else{ n dis _col(4) `"{browse `"`link'"': `title'}"' } } n `gap' } } if missing("`nocat'"){ n dis "" } } use "`html_text_dta'", clear } restore } end *Inspirit of -lianxh-(Yujun, Lian*;Junjie, Kang;Qingqing, Liu) * Authors: * Program written by Bolin, Song (松柏林) Shenzhen University , China. * Wechat:songbl_stata * Please do not use this code for commerical purpose *Songbl makes it easy for users to search and open thousands of Stata blog posts and useful Stata information in Stata window. You can also browse the papers and replication data & programs etc of China's industrial economy by category. capture program drop songbl_ssc program define songbl_ssc version 14 syntax [anything(name = class)] [,Cls Gap Line Num(numlist integer max=1 min=1 >0) Drop(string) ] qui{ capture local class=stritrim(`"`class'"') if _rc!=0{ local class=stritrim("`class'") } tokenize `class' **# cls-option if "`cls'" != ""{ cls n dis "" } **# gap-option if "`gap'" != "" { local gap dis "" } if "`class'" ==""{ n songbl_sbl ssc exit } preserve // 避免变量与用户变量冲突 clear //推文链接与标题 local path https://songbl-1304948727.cos.ap-guangzhou.myqcloud.com local url "`path'/songbl/ssc.txt" tempfile html_text html_text_dta html_text_seminar_paper_dta Share_txt songbl_post capture copy `"`url'"' `"`html_text'.txt"', replace local times = 0 while _rc ~= 0 { local times = `times' + 1 sleep 1000 capture copy `"`stata_paper_youdao'"' `"`html_text'.txt"', replace if `times' > 3 { disp as error "Internet speeds is too low to get the data" exit 601 } } infix strL v 1-100000 using `"`html_text'.txt"', clear capture erase `"`html_text'.txt"' //文本分割 split v,p("++") if _rc ~= 0 { di as err "Failed to get the data" exit 601 } //链接 标题 内容分类 作者 形式分类 日期 rename (v1-v6) (link title style type seminar_paper date) //后续检索关键词不区分大小写 gen title1 = lower(title) gen style1 = lower(style) gen text =title1+" "+style1 gen ad = strmatch(type,"*置顶*") drop if seminar_paper=="" **# drop-option foreach class_drop of local drop{ drop if strmatch(text,"*`class_drop'*") } **# 筛选关键词 //输入1个关键词 if "`1'"!="" & "`2'"=="" { if "`class'"=="new"{ if "`num'"==""{ local num=10 } sort date type style title drop if title=="new_songbl" drop in 1 drop if seminar_paper=="论文" drop if type=="songbl" capture keep in -`num'/ -1 } else{ capture local 1 = strlower(`"`1'"') if _rc!=0{ local 1 = strlower("`1'") } capture gen yjy1 = strmatch(text,`"*`1'*"') if _rc!=0{ gen yjy1 = strmatch(text,"*`1'*") } keep if yjy1==1 | ad==1 } } //输入两个及以上关键词 else{ if strmatch("`class'","*+*")==1 & strmatch("`class'","*-*")==1{ dis as error `" "+" 或者 "-" 号不能同时选择"' exit 198 } if strmatch(`"`class'"',"*+*")==1{ local class_new = subinstr(`"`class'"',"+"," ",.) tokenize `class_new' local wordn = wordcount("`class_new'") forvalues i = 1/`wordn'{ local `i' = strlower(`"``i''"') gen yjy`i' = strmatch(text,`"*``i''*"') } capture egen yjy=rowtotal(yjy*) if _rc!=0{ dis as error `" songbl : invalid songbl type"' exit 198 } keep if yjy>=1|ad==1 } else if strmatch(`"`class'"',"*-*")==1{ local class_new = subinstr(`"`class'"',"-"," ",.) tokenize `class_new' local wordn = wordcount("`class_new'") forvalues i = 1/`wordn'{ local `i' = strlower(`"``i''"') gen yjy`i' = strmatch(text,`"*``i''*"') } capture egen yjy=rowtotal(yjy*) if _rc!=0{ dis as error `" songbl : invalid songbl type"' exit 198 } keep if (yjy1==1 & yjy==1) | ad==1 } else{ local class_new = subinstr(`"`class'"',"-"," ",.) tokenize `class_new' local wordn = wordcount(`"`class_new'"') forvalues i = 1/`wordn'{ local `i' = strlower(`"``i''"') gen yjy`i' = strmatch(text,`"*``i''*"') } capture egen yjy=rowtotal(yjy*) if _rc!=0{ dis as error `" songbl : invalid songbl type"' exit 198 } keep if yjy==`wordn'| ad==1 } } local n =_N local ad =ad[1] count if ad==1 local coun_ad=`n'-`r(N)' n if `coun_ad'<=0{ dis as error `" {bf:抱歉,没有找到与 [ {it:`class'} ] 相关的外部命令。}"' _n dis as red `" 试试:{stata "songbl":[分类查看推文]}"' `" 或者 {stata "h songbl_cn":[查看帮助文档]}"' _n dis as text `" 或者试试网页搜索:"' dis as text _col(5)`" {stata " songbl `*',s(计量圈) "} 或 {stata " songbl `*',s(百度) "}"' dis as text _col(5)`" {stata " songbl `*',s(公众号) "} 或 {stata " songbl `*',s(知乎) "}"' dis as text _col(5)`" {stata " songbl `*',s(经管家) "} 或 {stata " songbl `*',s(全部) "}"' _n dis as red `" 或者试试检索代码:{stata "songbl `*',cie"}"' _n dis as text `" 如果您发现{bf:songbl}命令的使用bug,或者对{bf:songbl}命令的改善有什么建议"' dis as text `" 您可以通过以下链接填写资料告知我们"' dis as error `" {bf:点击链接:}"' dis as text _col(8) `" ({browse "https://www.wjx.top/vm/ekn2Nl0.aspx":https://www.wjx.top/vm/ekn2Nl0.aspx})"' dis "" exit } sort date type style title local n =_N local all_n=_N n dis as text "{center:Hello, Songbl Stata}" _n n dis as txt "{hline}" n dis in text _col(4) "{bf:Help}" _col(12) "{bf:Command}" _col(29) `"{bf:Date}"' _col(45) `"{bf:Description}"' n dis as txt "{hline}" n `gap' n forvalues i = 1/`n' { local link=link[`i'] local title=title[`i'] local type=type[`i'] local style=style[`i'] local seminar_paper =seminar_paper[`i'] local date =date[`i'] local col =45 if udstrlen(`"`title'"')<=100{ local title1=udsubstr(`"`title'"',1,00) dis _col(5) `"{stata `"`link'"':-}"' _col(9) `"{stata `"ssc describe `style'"': `style'}"' /// _col(29) `"`date'"' _col(45) `"`title'"' `gap' } if udstrlen(`"`title'"')>100 & udstrlen(`"`title'"')<=200{ local title1=udsubstr(`"`title'"',1,100) local title2=usubinstr(`"`title'"',`"`title1'"',"",.) local title2=udsubstr(`"`title2'"',1,100) dis _col(5) `"{stata `"`link'"':-}"' _col(9) `"{stata `"ssc describe `style'"': `style'}"' /// _col(29) `"`date'"' _col(45) `"`title1'"' dis _col(`col') `"`title2'"' `gap' } if udstrlen(`"`title'"')>200 & udstrlen(`"`title'"')<=300{ local title1=udsubstr(`"`title'"',1,100) local title2=usubinstr(`"`title'"',`"`title1'"',"",.) local title2=udsubstr(`"`title2'"',1,100) local title3=usubinstr(`"`title'"',`"`title1'`title2'"',"",.) local title3=udsubstr(`"`title3'"',1,100) dis _col(5) `"{stata `"`link'"':-}"' _col(9) `"{stata `"ssc describe `style'"': `style'}"' /// _col(29) `"`date'"' _col(45) `"`title1'"' dis _col(`col') `"`title2'"' dis _col(`col') `"`title3'"' `gap' } if udstrlen(`"`title'"')>300 & udstrlen(`"`title'"')<=400{ local title1=udsubstr(`"`title'"',1,100) local title2=usubinstr(`"`title'"',`"`title1'"',"",.) local title2=udsubstr(`"`title2'"',1,100) local title3=usubinstr(`"`title'"',`"`title1'`title2'"',"",.) local title3=udsubstr(`"`title3'"',1,100) local title4=usubinstr(`"`title'"',`"`title1'`title2'`title3'"',"",.) local title4=udsubstr(`"`title4'"',1,100) dis _col(5) `"{stata `"`link'"':-}"' _col(9) `"{stata `"ssc describe `style'"': `style'}"' /// _col(29) `"`date'"' _col(45) `"`title1'"' dis _col(`col') `"`title2'"' dis _col(`col') `"`title3'"' dis _col(`col') `"`title4'"' `gap' } if udstrlen(`"`title'"')>400 & udstrlen(`"`title'"')<=500{ local title1=udsubstr(`"`title'"',1,100) local title2=usubinstr(`"`title'"',`"`title1'"',"",.) local title2=udsubstr(`"`title2'"',1,100) local title3=usubinstr(`"`title'"',`"`title1'`title2'"',"",.) local title3=udsubstr(`"`title3'"',1,100) local title4=usubinstr(`"`title'"',`"`title1'`title2'`title3'"',"",.) local title4=udsubstr(`"`title4'"',1,100) local title5=usubinstr(`"`title'"',`"`title1'`title2'`title3'`title4'"',"",.) local title5=udsubstr(`"`title5'"',1,100) dis _col(5) `"{stata `"`link'"':-}"' _col(9) `"{stata `"ssc describe `style'"': `style'}"' /// _col(29) `"`date'"' _col(45) `"`title1'"' dis _col(`col') `"`title2'"' dis _col(`col') `"`title3'"' dis _col(`col') `"`title4'"' dis _col(`col') `"`title5'"' `gap' } if udstrlen(`"`title'"')>500 & udstrlen(`"`title'"')<=600{ local title1=udsubstr(`"`title'"',1,100) local title2=usubinstr(`"`title'"',`"`title1'"',"",.) local title2=udsubstr(`"`title2'"',1,100) local title3=usubinstr(`"`title'"',`"`title1'`title2'"',"",.) local title3=udsubstr(`"`title3'"',1,100) local title4=usubinstr(`"`title'"',`"`title1'`title2'`title3'"',"",.) local title4=udsubstr(`"`title4'"',1,100) local title5=usubinstr(`"`title'"',`"`title1'`title2'`title3'`title4'"',"",.) local title5=udsubstr(`"`title5'"',1,100) local title6=usubinstr(`"`title'"',`"`title1'`title2'`title3'`title4'`title5'"',"",.) local title6=udsubstr(`"`title6'"',1,100) dis _col(5) `"{stata `"`link'"':-}"' _col(9) `"{stata `"ssc describe `style'"': `style'}"' /// _col(29) `"`date'"' _col(45) `"`title1'"' dis _col(`col') `"`title2'"' dis _col(`col') `"`title3'"' dis _col(`col') `"`title4'"' dis _col(`col') `"`title5'"' dis _col(`col') `"`title6'"' `gap' } if udstrlen(`"`title'"')>600 & udstrlen(`"`title'"')<=700{ local title1=udsubstr(`"`title'"',1,100) local title2=usubinstr(`"`title'"',`"`title1'"',"",.) local title2=udsubstr(`"`title2'"',1,100) local title3=usubinstr(`"`title'"',`"`title1'`title2'"',"",.) local title3=udsubstr(`"`title3'"',1,100) local title4=usubinstr(`"`title'"',`"`title1'`title2'`title3'"',"",.) local title4=udsubstr(`"`title4'"',1,100) local title5=usubinstr(`"`title'"',`"`title1'`title2'`title3'`title4'"',"",.) local title5=udsubstr(`"`title5'"',1,100) local title6=usubinstr(`"`title'"',`"`title1'`title2'`title3'`title4'`title5'"',"",.) local title6=udsubstr(`"`title6'"',1,100) local title7=usubinstr(`"`title'"',`"`title1'`title2'`title3'`title4'`title5'`title6'"',"",.) local title7=udsubstr(`"`title7'"',1,100) dis _col(5) `"{stata `"`link'"':-}"' _col(9) `"{stata `"ssc describe `style'"': `style'}"' /// _col(29) `"`date'"' _col(45) `"`title1'"' dis _col(`col') `"`title2'"' dis _col(`col') `"`title3'"' dis _col(`col') `"`title4'"' dis _col(`col') `"`title5'"' dis _col(`col') `"`title6'"' dis _col(`col') `"`title7'"' `gap' } if udstrlen(`"`title'"')>700 & udstrlen(`"`title'"')<=10000{ local title1=udsubstr("`title'",1,100) local title2=usubinstr("`title'","`title1'","",.) local title2=udsubstr("`title2'",1,100) local title3=usubinstr("`title'","`title1'`title2'","",.) local title3=udsubstr("`title3'",1,100) local title4=usubinstr("`title'","`title1'`title2'`title3'","",.) local title4=udsubstr("`title4'",1,100) local title5=usubinstr("`title'","`title1'`title2'`title3'`title4'","",.) local title5=udsubstr("`title5'",1,100) local title6=usubinstr("`title'","`title1'`title2'`title3'`title4'`title5'","",.) local title6=udsubstr("`title6'",1,100) local title7=usubinstr("`title'","`title1'`title2'`title3'`title4'`title5'`title6'","",.) local title7=udsubstr("`title7'",1,100) local title8=usubinstr("`title'","`title1'`title2'`title3'`title4'`title5'`title6'`title7'","",.) local title8=udsubstr("`title8'",1,100) dis _col(5) `"{stata `"`link'"':-}"' _col(9) `"{stata `"ssc describe `style'"': `style'}"' /// _col(29) `"`date'"' _col(45) `"`title1'"' dis _col(`col') `"`title2'"' dis _col(`col') `"`title3'"' dis _col(`col') `"`title4'"' dis _col(`col') `"`title5'"' dis _col(`col') `"`title6'"' dis _col(`col') `"`title7'"' dis _col(`col') `"`title8'"' if udstrlen("`title'")>800{ dis _col(`col') `"{bf:注}:超过八行的内容不再打印,完整内容请:help `style'"' } `gap' } n if "`line'"!=""{ dis as txt "{hline}" `gap' } } if "`line'"==""{ n dis as txt "{hline}" } n dis as text _col(3) `"注:由谷歌翻译自动转为中文"' _n } restore end capture program drop songbl_paper program define songbl_paper version 14 syntax [anything(name = class)] /// [, /// Mlink /// // - [论文标题](URL) MText /// // [论文标题](URL) MUrl /// // n. [论文标题](URL) Wlink /// // 论文标题: URL WText /// // 论文标题: URL WUrl /// // n. 论文标题: URL NOCat /// // 不呈现论文分类信息 Cls /// // 清屏后显示结果 Gap /// // 在输出的结果论文之间进行空格一行 SAVE(string) /// // 利用文档打开分享的内容。 REPLACE /// // 生成分享内容的 STATA 数据集。 CLIP /// // 点击剪切分享,与 Wlink 搭配使用 DROP(string) /// // 删除关键词 Journal(string) /// fy /// ] * *==============================================================================* *==============================================================================* qui{ cap local class=stritrim(`"`class'"') if _rc!=0{ local class=stritrim("`class'") } tokenize `class' **# cls-option if "`cls'" != ""{ cls n dis "" } local path https://songbl-1304948727.cos.ap-guangzhou.myqcloud.com local URL "`path'/navigation" if "`class'"==""{ if missing("`journal'"){ n songbl_links1 ,url(`URL'/paper.txt) exit } else{ local class * } } if missing("`journal'"){ n dis as error `"需要使用选择项 journal() 指定检索的期刊"' n dis as txt "例如检索ARE文章 :" "{stata songbl paper `class',j(aer):songbl paper `class',j(aer)}" n dis as txt _col(19) "{stata songbl paper `class',j(世界经济):songbl paper `class',j(世界经济)}" n dis "查看帮助文档 :" `"{stata "help songbl paper":songbl paper help }"' n dis "分类查看所有期刊:" `"{stata "songbl paper":songbl paper}"' exit } else{ local journal = strlower("`journal'") } **# gap-option if "`gap'" != "" { local gap dis "" local gap1 post songbl_post ("" ) } **# replace-option if ("`replace'"=="") { preserve } else{ des if `r(N)'!=0{ dis as error `"no; dataset in memory has changed since last saved"' exit 4 } } // 避免变量与用户变量冲突 clear //论文链接与标题 local path https://songbl-1304948727.cos.ap-guangzhou.myqcloud.com if "`fy'"!=""{ local journal "`journal'_fy" } percentencode `"`journal'"' local url "`path'/songbl/paper/`r(percentencode)'.txt" tempfile html_text html_text_dta html_text_seminar_paper_dta Share_txt songbl_post capture copy `"`url'"' `"`html_text'.txt"', replace local times = 0 while _rc ~= 0 { local times = `times' + 1 sleep 1000 capture copy `"`stata_paper_youdao'"' `"`html_text'.txt"', replace if `times' > 3 { gettoken name 0 : journal, parse("_") disp as error "请检查期刊{bf:《`name'》}是否存在" disp as error "分类查看所有期刊:" `"{stata "songbl paper":songbl paper}"' disp as error "Internet speeds is too low to get the data" exit 601 } } infix strL v 1-100000 using `"`html_text'.txt"', clear capture erase `"`html_text'.txt"' //文本分割 split v,p("++") if _rc ~= 0 { di as err "Failed to get the data" exit 601 } //链接 标题 期刊与期号 学术论文 形式分类 rename (v1-v5) (link title style type seminar_paper) //后续检索关键词不区分大小写 replace style = plural(2, style,"-学术论文") gen title1 = lower(title) gen style1 = lower(style) gen text =title1+" "+style1 gen ad = strmatch(type,"*songbl*") drop if seminar_paper=="" **# drop-option foreach class_drop of local drop{ drop if strmatch(text,"*`class_drop'*") } **# 筛选关键词 //输入1个关键词 if "`1'"!="" & "`2'"=="" { capture local 1 = strlower(`"`1'"') if _rc!=0{ local 1 = strlower("`1'") } capture gen yjy1 = strmatch(text,`"*`1'*"') if _rc!=0{ gen yjy1 = strmatch(text,"*`1'*") } keep if yjy1==1 | ad==1 } //输入两个及以上关键词 else{ if strmatch("`class'","*+*")==1 & strmatch("`class'","*-*")==1{ dis as error `" "+" 或者 "-" 号不能同时选择"' exit 198 } if strmatch(`"`class'"',"*+*")==1{ local class_new = subinstr(`"`class'"',"+"," ",.) tokenize `class_new' local wordn = wordcount("`class_new'") forvalues i = 1/`wordn'{ local `i' = strlower(`"``i''"') gen yjy`i' = strmatch(text,`"*``i''*"') } capture egen yjy=rowtotal(yjy*) if _rc!=0{ dis as error `" songbl paper : invalid songbl paper type"' exit 198 } keep if yjy>=1|ad==1 } else if strmatch(`"`class'"',"*-*")==1{ local class_new = subinstr(`"`class'"',"-"," ",.) tokenize `class_new' local wordn = wordcount("`class_new'") forvalues i = 1/`wordn'{ local `i' = strlower(`"``i''"') gen yjy`i' = strmatch(text,`"*``i''*"') } capture egen yjy=rowtotal(yjy*) if _rc!=0{ dis as error `" songbl paper : invalid songbl paper type"' exit 198 } keep if (yjy1==1 & yjy==1) | ad==1 } else{ local class_new = subinstr(`"`class'"',"-"," ",.) tokenize `class_new' local wordn = wordcount(`"`class_new'"') forvalues i = 1/`wordn'{ local `i' = strlower(`"``i''"') gen yjy`i' = strmatch(text,`"*``i''*"') } capture egen yjy=rowtotal(yjy*) if _rc!=0{ dis as error `" songbl paper: invalid songbl paper type"' exit 198 } keep if yjy==`wordn'| ad==1 } } local n =_N local ad =ad[1] count if ad==1 local coun_ad=`n'-`r(N)' n if `coun_ad'<=0{ dis as error `" {bf:抱歉,在《`journal'》没有找到与 [ {it:`class'} ] 相关的论文。}"' _n dis as red `" 试试:{stata "songbl paper":[分类查看论文]}"' `" 或者 {stata "h songbl_cn":[查看帮助文档]}"' _n dis as text `" 或者试试网页搜索:"' dis as text _col(5)`" {stata " songbl `*',s(计量圈) "} 或 {stata " songbl `*',s(百度) "}"' dis as text _col(5)`" {stata " songbl `*',s(公众号) "} 或 {stata " songbl `*',s(知乎) "}"' dis as text _col(5)`" {stata " songbl `*',s(经管家) "} 或 {stata " songbl `*',s(全部) "}"' _n dis as red `" 或者试试检索代码:{stata "songbl `*',cie"}"' _n dis as text `" 如果您发现{bf:songbl}命令的使用bug,或者对{bf:songbl}命令的改善有什么建议"' dis as text `" 您可以通过以下链接填写资料告知我们"' dis as error `" {bf:点击链接:}"' dis as text _col(8) `" ({browse "https://www.wjx.top/vm/ekn2Nl0.aspx":https://www.wjx.top/vm/ekn2Nl0.aspx})"' dis "" exit } **# 关键词打印 if "`wlink'" =="" & "`wtext'"=="" & "`mlink'"=="" & "`mtext'"=="" & "`murl'"=="" & "`wurl'"=="" { //保存关键词 "class" 搜索到的数据 save "`html_text_dta'",replace levelsof seminar_paper,local(seminar_paper) foreach seminar_paper in `seminar_paper'{ use "`html_text_dta'",clear keep if seminar_paper==`"`seminar_paper'"' save "`html_text_seminar_paper_dta'",replace levelsof style,local(number) foreach num in `number' { use "`html_text_seminar_paper_dta'",clear keep if style=="`num'" local n=_N if `n'>0{ sort title if missing("`nocat'"){ if missing("`journal'"){ n dis as w `" `seminar_paper' >>"' `"{stata "songbl paper `num' ": `num'}"' } else{ n dis as w `" `seminar_paper' >>"' `"{stata "songbl paper `num',j(`journal') ": `num'}"' } } forvalues i = 1/`n'{ local link=link[`i'] local title=title[`i'] capture dis strmatch(`"`link'"',"* *")==1 if _rc==0{ if strmatch(`"`link'"',"* *")==1{ n dis _col(4) `"{stata `"`link'"': `title'}"' } else{ n dis _col(4) `"{browse `"`link'"': `title'}"' } } else{ if strmatch("`link'","* *")==1{ n dis _col(4) `"{stata `"`link'"': `title'}"' } else{ n dis _col(4) `"{browse `"`link'"': `title'}"' } } n `gap' } } if missing("`nocat'"){ n dis "" } } } if "`save'"!="" { dis as error `" 命令格式有误,see { stata " help songbl_cn" }"' dis as error `" Note:save 选择项必须与 wlink 、wtext 、mlink 、mtext、murl、wurl 等分享功能一起使用 "' exit 198 } use "`html_text_dta'", clear } else{ if "`mlink'" !="" | "`mtext'" !="" | "`murl'" !=""{ drop if strmatch(link,`"* *"')==1 } save "`html_text_dta'", replace // 保存关键词 "class" 搜索到的数据 capture postclose songbl_post postfile songbl_post str1000 Share using "`songbl_post'", replace **# wlink-option if "`wlink'" !=""{ n dis "" n dis as txt _n "{hline 24} wlink文本格式 {hline 24}" n dis as txt n dis as res "* 以下内容由 -songbl- 命令生成,安装命令:ssc install songbl,replace" n dis as res "* 查看更多内容请在 Stata 窗口输入代码:songbl paper `class'" post songbl_post ("* 以下内容由 -songbl- 命令生成,安装命令:ssc install songbl,replace") post songbl_post ("* 查看更多内容请在 Stata 窗口输入代码:songbl paper `class'") n dis as txt post songbl_post (" ") levelsof seminar_paper,local(seminar_paper) local m=_N foreach seminar_paper in `seminar_paper' { use "`html_text_dta'", clear keep if seminar_paper==`"`seminar_paper'"' save "`html_text_seminar_paper_dta'", replace levelsof style,local(number) foreach num in `number'{ use "`html_text_seminar_paper_dta'", clear keep if style=="`num'" local n=_N if `n'>0{ sort title if missing("`nocat'"){ if missing("`journal'"){ n dis as w `" `seminar_paper' >>"' `"{stata "songbl paper `num' ": `num'}"' } else{ n dis as w `" `seminar_paper' >>"' `"{stata "songbl paper `num',j(`journal') ": `num'}"' } n `gap' `gap1' post songbl_post (" `seminar_paper' >> `num'" ) } forvalues i = 1/`n' { local link=link[`i'] local title=title[`i'] cap di wordcount(`"`title': `link'"') if _rc==0{ post songbl_post (`"`title': `link'"') } if "`clip'"==""{ n dis as y `"`title': `link'"' } else{ local clip1 `"`title': `link'"' local clip2 `"`title': `link'"' n dis `"{stata `"!echo `clip1' Copy by #公众号:songbl | clip"': `clip2'}"' } n `gap' `gap1' } } if missing("`nocat'"){ n dis "" post songbl_post (" " ) } } } n dis "" n dis as txt "{hline 24} 分享复制以上内容 {hline 24}" n dis as red "{bf:小提示:}" `"使用 {stata `"songbl paper `class', w clip j(`journal')"':songbl paper `class', w clip j(`journal')} 后,"' "点击超链接,按Ctrl+V可进行粘贴" n dis as red " 建议分多次复制到微信对话框,每次 10 行,否则超链接无法生效" n dis as red " 长链接断行导致打印失败。请使用" `" {stata `"songbl paper `class',w replace j(`journal')"':songbl paper `class', w replace j(`journal')}"' "或者" `" {stata `"songbl paper `class',w save(txt) j(`journal')"':songbl paper `class',w save(txt) j(`journal')}"' } **# wtext-option if "`wtext'" !=""{ n dis "" n dis as txt _n "{hline 24} wtxt文本格式 {hline 24}" n dis as txt n dis as res "* 以下内容由 -songbl- 命令生成,安装命令:ssc install songbl,replace" n dis as res "* 查看更多内容请在 Stata 窗口输入代码:songbl paper `class'" post songbl_post ("* 以下内容由 -songbl- 命令生成,安装命令:ssc install songbl,replace") post songbl_post ("* 查看更多内容请在 Stata 窗口输入代码:songbl paper `class'") n dis as txt post songbl_post (" ") use "`html_text_dta'", clear levelsof seminar_paper , local(seminar_paper) local m=_N foreach seminar_paper in `seminar_paper' { use "`html_text_dta'", clear keep if seminar_paper==`"`seminar_paper'"' save "`html_text_seminar_paper_dta'", replace levelsof style,local(number) foreach num in `number'{ use "`html_text_seminar_paper_dta'", clear keep if style=="`num'" local n=_N if `n'>0{ sort title if missing("`nocat'"){ if missing("`journal'"){ n dis as w `" `seminar_paper' >>"' `"{stata "songbl paper `num' ": `num'}"' } else{ n dis as w `" `seminar_paper' >>"' `"{stata "songbl paper `num',j(`journal') ": `num'}"' } post songbl_post (" `seminar_paper' >> `num'" ) n `gap' `gap1' } forvalues i = 1/`n'{ local link=link[`i'] local title=title[`i'] cap di wordcount(`"`title': `link'"') if _rc==0{ n dis as text `"`title'"' n dis as text `"`link'"' post songbl_post (`"`title'"') post songbl_post (`"`link'"') } n `gap' `gap1' } } if missing("`nocat'"){ post songbl_post (" " ) n dis "" } } } n dis "" n dis as txt "{hline 24} 分享复制以上内容 {hline 24}" n dis as red "{bf:小提示:}多条长链接直接复制会断行。建议使用" `" {stata `"songbl paper `class',wt replace j(`journal')"':songbl paper `class',wt replace j(`journal')}"' "或者" `" {stata `"songbl paper `class' ,wt save(txt) j(`journal')"':songbl paper `class',wt save(txt) j(`journal')}"' } **# wurl-option if "`wurl'" !=""{ n dis "" n dis as txt _n "{hline 24} wurl文本格式 {hline 24}" n dis as txt n dis as res "* 以下内容由 -songbl- 命令生成,安装命令:ssc install songbl,replace" n dis as res "* 查看更多内容请在 Stata 窗口输入代码:songbl paper `class'" post songbl_post ("* 以下内容由 -songbl- 命令生成,安装命令:ssc install songbl,replace") post songbl_post ("* 查看更多内容请在 Stata 窗口输入代码:songbl paper `class'") n dis as txt post songbl_post (" ") use "`html_text_dta'", clear levelsof seminar_paper , local(seminar_paper) local m=_N foreach seminar_paper in `seminar_paper' { use "`html_text_dta'", clear keep if seminar_paper==`"`seminar_paper'"' save "`html_text_seminar_paper_dta'", replace levelsof style , local(number) foreach num in `number' { use "`html_text_seminar_paper_dta'", clear keep if style=="`num'" local n=_N if `n'>0{ sort title if missing("`nocat'"){ if missing("`journal'"){ n dis as w `" `seminar_paper' >>"' `"{stata "songbl paper `num' ": `num'}"' } else{ n dis as w `" `seminar_paper' >>"' `"{stata "songbl paper `num',j(`journal') ": `num'}"' } post songbl_post (" `seminar_paper' >> `num'" ) n `gap' `gap1' } forvalues i = 1/`n' { local link=link[`i'] local title=title[`i'] cap di wordcount(`"`title': `link'"') if _rc==0{ if `n'==1{ n dis as text `"`title': `link'"' post songbl_post (`"`title': `link'"') } else { n dis as text `"`i'. `title': `link'"' post songbl_post (`"`i'. `title': `link'"') } } n `gap' `gap1' } } if missing("`nocat'"){ post songbl_post (" " ) n dis "" } } } n dis "" n dis as txt "{hline 24} 分享复制以上内容 {hline 24}" n dis as red "{bf:小提示:}多条长链接直接复制会断行。建议使用" `" {stata `"songbl paper `class',wu replace j(`journal')"':songbl paper `class',wu replace j(`journal')}"' "或者" `" {stata `"songbl paper `class',wu save(txt) j(`journal')"':songbl paper `class',wu save(txt) j(`journal')}" } **# mlink-option if "`mlink'" !=""{ n dis "" n dis as txt _n "{hline 24} mlik文本格式 {hline 24}" n dis as txt n dis as res "> 以下内容由 -songbl- 命令生成,安装命令:**ssc install songbl,replace**" n dis as res "> 查看更多内容请在 Stata 窗口输入代码:**songbl paper `class'**" post songbl_post ("#
`class'
") post songbl_post ("**以下论文列表由 **songbl** 命令生成**") post songbl_post ("```") post songbl_post ("Note:产生如下论文列表的 Stata 命令为:") post songbl_post (". songbl paper `class',j(`journal')") post songbl_post ("安装最新版 songbl命令:") post songbl_post (". ssc install songbl, replace") post songbl_post ("```") post songbl_post ("---") n dis as txt "---" use "`html_text_dta'",clear levelsof seminar_paper , local(seminar_paper) local m=_N foreach seminar_paper in `seminar_paper'{ use "`html_text_dta'", clear keep if seminar_paper==`"`seminar_paper'"' save "`html_text_seminar_paper_dta'", replace levelsof style , local(number) foreach num in `number'{ use "`html_text_seminar_paper_dta'", clear keep if style=="`num'" local n=_N if `n'>0{ sort title if missing("`nocat'"){ if missing("`journal'"){ n dis as w _col(4) "### `seminar_paper' >>"`"{stata "songbl paper `num'",j(`journal: `num'}"'" } else{ n dis as w _col(4) "### `seminar_paper' >>"`"{stata "songbl paper `num',j(`journal')": `num'}"'" } post songbl_post ("### `seminar_paper' >> `num'" ) n `gap' `gap1' } forvalues i = 1/`n' { local link=link[`i'] local title=title[`i'] cap di wordcount(`"`title': `link'"') if _rc==0{ n dis as text `"- [`title'](`link')"' post songbl_post (`"- [`title'](`link')"') } n `gap' `gap1' } } if missing("`nocat'"){ post songbl_post (" " ) n dis "" } } } post songbl_post ("## **Stata** 交流群微信:songbl_stata") n dis "" n dis as txt "{hline 24} 分享复制以上内容 {hline 24}" n dis as red "{bf:小提示:}多条长链接直接复制会断行。建议使用:" `" {stata `"songbl paper `class',m replace j(`journal')"':songbl paper `class',m replace j(`journal')}"' n dis as red _col(9) "利用" `"{browse "https://editor.mdnice.com/": Mdnice }"' "编辑器输出PDF格式" `" {stata `"songbl paper `class',m save(txt) j(`journal')"': songbl paper `class',m save(txt) j(`journal')}"' } **# mtext-option if "`mtext'" !=""{ n dis "" n dis as txt _n "{hline 24} mtext文本格式 {hline 24}" n dis as txt n dis as res "> 以下内容由 -songbl- 命令生成,安装命令:**ssc install songbl,replace**" n dis as res "> 查看更多内容请在 Stata 窗口输入代码:**songbl paper `class'**" post songbl_post ("#
`class'
") post songbl_post ("**以下论文列表由 **songbl** 命令生成**") post songbl_post ("```") post songbl_post ("Note:产生如下论文列表的 Stata 命令为:") post songbl_post (". songbl paper `class',j(`journal')") post songbl_post ("安装最新版 songbl命令:") post songbl_post (". ssc install songbl, replace") post songbl_post ("```") n dis as txt "---" post songbl_post ("---") use "`html_text_dta'", clear levelsof seminar_paper,local(seminar_paper) local m=_N foreach seminar_paper in `seminar_paper'{ use "`html_text_dta'", clear keep if seminar_paper==`"`seminar_paper'"' save "`html_text_seminar_paper_dta'",replace levelsof style,local(number) foreach num in `number' { use "`html_text_seminar_paper_dta'",clear keep if style=="`num'" local n=_N if `n'>0{ sort title if missing("`nocat'"){ if missing("`journal'"){ n dis as w _col(4) "### `seminar_paper' >>"`"{stata "songbl paper `num'",j(`journal: `num'}"'" } else{ n dis as w _col(4) "### `seminar_paper' >>"`"{stata "songbl paper `num',j(`journal')": `num'}"'" } post songbl_post ("### `seminar_paper' >> `num'" ) n `gap' `gap1' } forvalues i = 1/`n' { local link=link[`i'] local title=title[`i'] cap di wordcount(`"`title': `link'"') if _rc==0{ n dis as text `"[`title'](`link')"' post songbl_post (`"[`title'](`link')"') } n `gap' `gap1' } } if missing("`nocat'"){ post songbl_post (" " ) n dis "" } } } post songbl_post ("## **Stata** 交流群微信:songbl_stata") n dis "" n dis as txt "{hline 24} 分享复制以上内容 {hline 24}" n dis as red "{bf:小提示:}多条长链接直接复制会断行。建议使用:" `" {stata `"songbl paper `class',mt replace j(`journal')"':songbl paper `class',mt replace j(`journal')}"' n dis as red _col(9) "利用" `"{browse "https://editor.mdnice.com/": Mdnice }"' "编辑器输出PDF格式" `" {stata `"songbl paper `class',mt save(txt) j(`journal')"': songbl paper `class',mt save(txt) j(`journal')}"' } **# murl-option if "`murl'" !=""{ n dis "" n dis as txt _n "{hline 24} murl文本格式 {hline 24}" n dis as txt n dis as res "> 以下内容由 -songbl- 命令生成,安装命令:**ssc install songbl,replace**" n dis as res "> 查看更多内容请在 Stata 窗口输入代码:**songbl paper `class'**" post songbl_post ("#
`class'
") post songbl_post ("**以下论文列表由 **songbl** 命令生成**") post songbl_post ("```") post songbl_post ("Note:产生如下论文列表的 Stata 命令为:") post songbl_post (". songbl paper `class',j(`journal')") post songbl_post ("安装最新版 songbl命令:") post songbl_post (". ssc install songbl, replace") post songbl_post ("```") n dis as txt "---" post songbl_post ("---") use "`html_text_dta'", clear levelsof seminar_paper,local(seminar_paper) local m=_N foreach seminar_paper in `seminar_paper'{ use "`html_text_dta'", clear keep if seminar_paper==`"`seminar_paper'"' save "`html_text_seminar_paper_dta'",replace levelsof style,local(number) foreach num in `number' { use "`html_text_seminar_paper_dta'",clear keep if style=="`num'" local n=_N if `n'>0{ sort title if missing("`nocat'"){ if missing("`journal'"){ n dis as w _col(4) "### `seminar_paper' >>"`"{stata paper "songbl `num',j(`journal": `num'}"'" } else{ n dis as w _col(4) "### `seminar_paper' >>"`"{stata "songbl paper `num',j(`journal')": `num'}"'" } post songbl_post ("### `seminar_paper' >> `num'" ) n `gap' `gap1' } forvalues i = 1/`n' { local link=link[`i'] local title=title[`i'] cap di wordcount(`"`title': `link'"') if _rc==0{ if `n'==1{ n dis "" n dis as text `"[`title'](`link')"' post songbl_post ("") post songbl_post (`"[`title'](`link')"') } else { n dis as text `"`i'. [`title'](`link')"' post songbl_post (`"`i'. [`title'](`link')"') } } n `gap' `gap1' } } if missing("`nocat'"){ post songbl_post (" " ) n dis "" } } } post songbl_post ("## **Stata** 交流群微信:songbl_stata") n dis "" n dis as txt "{hline 24} 分享复制以上内容 {hline 24}" n dis as red "{bf:小提示:}多条长链接直接复制会断行。建议使用:" `" {stata `"songbl paper `class',mu replace j(`journal')"':songbl paper `class',mu replace j(`journal')}"' n dis as red _col(9) "利用" `"{browse "https://editor.mdnice.com/": Mdnice }"' "编辑器输出PDF格式" `" {stata `"songbl paper `class',mu save(txt) j(`journal')"': songbl paper `class',mu save(txt) j(`journal')}"' } postclose songbl_post use "`songbl_post'", clear cap format %-200s Share } if ("`replace'"!="") { cap keep link title style type seminar_paper cap label variable link "链接" cap label variable title "标题" cap label variable style "分类" cap label variable type "来源" cap label variable seminar_paper "论文" cap label variable data "更新时间" } **# save-option if ("`save'"!="") { export delimited Share using "`Share_txt'.`save'" , /// novar nolabel delimiter(tab) replace view browse "`Share_txt'.`save'" } cap erase `"`html_text'.txt"' if ("`replace'"=="") { restore } if "`fy'"!=""{ n dis as txt `" 提示:"' "论文标题由谷歌翻译完成,仅供参考" } } end cap program drop songbl_links1 program define songbl_links1 version 8 syntax [anything][,URL(string)] /// preserve qui{ clear tempfile html_text cap copy `"`url'"' `"`html_text'.txt"', replace local times = 0 while _rc ~= 0 { local times = `times' + 1 sleep 1000 cap copy `"`url'"' `"`html_text'.txt"', replace if `times' > 10 { disp as error "Internet speeds is too low to get the data" exit 601 } } infix strL v 1-100000 using `"`html_text'.txt"', clear cap erase `"`html_text'.txt"' split v, p("++") cap keep v1 v2 } local name =v1[1] //导航标题 local number1=v1[2] local number2=v1[3] local c1 =v1[4] local c2 =v1[5] local c3 =v1[6] qui drop if v2=="" local G = 3 // 每行显示个数 local N = _N // 类别数 local NN = int(`N'/`G') // 行数 local mod = mod(`N',3) //剩余个数 dis in w _col(`number1') _n _skip(`number2') `"`name'"' _n local k1=1 forvalues o = 1/`NN'{ local a`k1'= v1[`k1'] local b`k1'= v2[`k1'] local k2=`k1'+1 local a`k2'= v1[`k2'] local b`k2'= v2[`k2'] local k3=`k1'+2 local a`k3'= v1[`k3'] local b`k3'= v2[`k3'] if strmatch("`b`k1''","* *")==1{ dis in w _col(`c1') `"{stata "`b`k1''":`a`k1''}"' _continue } else{ dis in w _col(`c1') `"{browse "`b`k1''":`a`k1''}"' _continue } if strmatch("`b`k2''","* *")==1{ dis in w _col(`c2') `"{stata "`b`k2''":`a`k2''}"' _continue } else{ dis in w _col(`c2') `"{browse "`b`k2''":`a`k2''}"' _continue } if strmatch("`b`k3''","* *")==1{ dis in w _col(`c3') `"{stata "`b`k3''":`a`k3''}"' _n } else{ dis in w _col(`c3') `"{browse "`b`k3''":`a`k3''}"' _n } local k1=`k1'+3 } local a_n1 =`NN'*3+1 local a_n2 =`NN'*3+2 local a`a_n1'=v1[`a_n1'] local b`a_n1'=v2[`a_n1'] local a`a_n2'=v1[`a_n2'] local b`a_n2'=v2[`a_n2'] if `mod'==1{ if strmatch("`b`k1''","* *")==1{ dis in w _col(`c1') `"{stata "`b`a_n1''":`a`a_n1''}"' } else{ dis in w _col(`c1') `"{browse "`b`a_n1''":`a`a_n1''}"' } } if `mod'==2{ if strmatch("`b`k1''","* *")==1{ dis in w _col(`c1') `"{stata "`b`a_n1''":`a`a_n1''}"' _continue } else { dis in w _col(`c1') `"{browse "`b`a_n1''":`a`a_n1''}"' _continue } if strmatch("`b`k2''","* *")==1{ dis in w _col(`c2') `"{stata "`b`a_n2''":`a`a_n2''}"' } else{ dis in w _col(`c2') `"{browse "`b`a_n2''":`a`a_n2''}"' } } restore end cap program drop songbl_links program define songbl_links version 8 syntax [anything] [,URL(string)] qui{ preserve clear tempfile html_text cap copy `"`url'"' `"`html_text'.txt"', replace local times = 0 while _rc ~= 0 { local times = `times' + 1 sleep 1000 cap copy `"`URL'"' `"`html_text'.txt"', replace if `times' > 10 { disp as error "Internet speeds is too low to get the data" cap erase `"`html_text'.txt"' exit 601 } } infix strL v 1-100000 using `"`html_text'.txt"', clear cap erase `"`html_text'.txt"' split v, p("++") cap keep v1 v2 local name =v1[1] //导航标题 local number1=v1[2] local number2=v1[3] local number3=v1[4] count if v2=="" local r(N)=`r(N)'-7 forvalues i=1/`r(N)'{ local j=`i'+4 local c`i'=v1[`j'] } drop if v2=="" } local G = 6 // 每个专题显示个数 local N = _N // 类别数 local NN = int(`N'/`G') // 行数 local mod = mod(`N',6) // 剩余个数 dis in w _col(`number1') _n _skip(`number2') `"`name'"' _n local k1=1 local m=5 forvalues o = 1/`NN'{ forvalues i=1/6{ local a`k`i''= v1[`k`i''] local b`k`i''= v2[`k`i''] local j =`i'+1 local k`j' =`k`i''+1 } forvalues i=1/6{ if strmatch("`b`k`i'''","* *")==1{ local browse_stata`i' stata } else{ local browse_stata`i' browse } } dis in w " `c`m'': " /// _col(`c1') `"{`browse_stata1' "`b`k1''":`a`k1''}"' /// _col(`c2') `"{`browse_stata2' "`b`k2''":`a`k2''}"' /// _col(`c3') `"{`browse_stata3' "`b`k3''":`a`k3''}"' dis in w _col(`number3') /// _col(`c1') `"{`browse_stata4' "`b`k4''":`a`k4''}"' /// _col(`c2') `"{`browse_stata5' "`b`k5''":`a`k5''}"' /// _col(`c3') `"{`browse_stata6' "`b`k6''":`a`k6''}"' /// _n local k1=`k1'+6 local m=`m'+1 } forvalues i=1/5{ local a_n`i' =`NN'*6+`i' local a`a_n`i''=v1[`a_n`i''] local b`a_n`i''=v2[`a_n`i''] } forvalues i=1/6{ if strmatch("`b`a_n`i'''","* *")==1{ local browse_stata`i' stata } else{ local browse_stata`i' browse } } if `mod'==1{ dis in w " `c`m'': " /// _col(`c1') `"{`browse_stata1' "`b`a_n1''":`a`a_n1''}"' } if `mod'==2{ dis in w " `c`m'': " /// _col(`c1') `"{`browse_stata1' "`b`a_n1''":`a`a_n1''}"' /// _col(`c2') `"{`browse_stata2' "`b`a_n2''":`a`a_n2''}"' } if `mod'==3{ dis in w " `c`m'': " /// _col(`c1') `"{`browse_stata1' "`b`a_n1''":`a`a_n1''}"' /// _col(`c2') `"{`browse_stata2' "`b`a_n2''":`a`a_n2''}"' /// _col(`c3') `"{`browse_stata3' "`b`a_n3''":`a`a_n3''}"' } if `mod'==4{ dis in w " `c`m'': " /// _col(`c1') `"{`browse_stata1' "`b`a_n1''":`a`a_n1''}"' /// _col(`c2') `"{`browse_stata2' "`b`a_n2''":`a`a_n2''}"' /// _col(`c3') `"{`browse_stata3' "`b`a_n3''":`a`a_n3''}"' dis in w _col(`number3') /// _col(`c1') `"{`browse_stata4' "`b`a_n4''":`a`a_n4''}"' } if `mod'==5{ dis in w " `c`m'': " /// _col(`c1') `"{`browse_stata1' "`b`a_n1''":`a`a_n1''}"' /// _col(`c2') `"{`browse_stata2' "`b`a_n2''":`a`a_n2''}"' /// _col(`c3') `"{`browse_stata3' "`b`a_n3''":`a`a_n3''}"' dis in w _col(`number3') /// _col(`c1') `"{`browse_stata4' "`b`a_n4''":`a`a_n4''}"' /// _col(`c2') `"{`browse_stata5' "`b`a_n5''":`a`a_n5''}"' } cap erase `"`html_text'.txt"' restore end cap program drop songbl_install program define songbl_install gettoken pkgname 0 : 0, parse(" ,") CheckPkgname "songbl install" `"`pkgname'"' local pkgname `"`s(pkgname)'"' syntax [, ALL REPLACE] local ltr = bsubstr("`pkgname'",1,1) qui net from https://songbl-1304948727.cos.ap-guangzhou.myqcloud.com/ado/plus/`ltr' capture net describe `pkgname' local rc = _rc if _rc==601 | _rc==661 { di as err /* */ `"{bf:ssc install}: "{bf:`pkgname'}" not found at SSC, type {stata search `pkgname'}"' di as err /* */ "(To find all packages at SSC that start with `ltr', type {stata ssc describe `ltr'})" exit `rc' } if _rc { error `rc' } capture noi net install `pkgname', `all' `replace' noi di as txt "see help {help `pkgname':`pkgname'}" noi di as txt `"Join a stata {browse "https://songbl-1304948727.cos.ap-guangzhou.myqcloud.com/picture/wechat/wechat.jpg":wechat group}"' local rc = _rc if _rc==601 | _rc==661 { di di as err /* */ `"{p}{bf:ssc install}: apparent error in package file for {bf:`pkgname'}; please notify {browse "mailto:songbl_stata@qq.com":songbl_stata@qq.com}, providing package name{p_end}"' } exit `rc' end cap program drop CheckPkgname program define CheckPkgname, sclass args id pkgname sret clear if `"`pkgname'"' == "" { di as err `"{bf:`id'}: nothing found where package name expected"' exit 198 } if length(`"`pkgname'"')==1 { di as err `"{bf:`id'}: "{bf:`pkgname'}" invalid SSC package name"' exit 198 } local pkgname = lower(`"`pkgname'"') if !index("abcdefghijklmnopqrstuvwxyz_",bsubstr(`"`pkgname'"',1,1)) { di as err `"{bf:`id'}: "{bf:`pkgname'}" invalid SSC package name"' exit 198 } sret local pkgname `"`pkgname'"' end capture program drop songbl_fy program define songbl_fy ,rclass version 12.0 syntax [anything(name = content)], [Command PDF REPLACE] //下载外部命令 foreach com in wordconvert moss fs hlp2html{ cap which `com' if _rc!=0{ ssc install `com' } } if `"`content'"'=="" & `"`pdf'"'==""{ local path https://songbl-1304948727.cos.ap-guangzhou.myqcloud.com local URL "`path'/navigation" n songbl_links1 ,url(`URL'/fanyi.txt) exit } //翻译pdf if `"`pdf'"'!=""{ if `"`content'"'!=""{ local htmlfile = usubinstr(`"`content'"',".pdf","",.) local htmlfile = usubinstr(`"`htmlfile'"',`"""',"",.) cap wordconvert "`htmlfile'.pdf" "`htmlfile'.html",encoding(gb2312) songbl dir "`htmlfile'.html",max(1) } else{ qui fs *.pdf foreach file in `r(files)'{ local htmlfile = usubinstr("`file'",".pdf","",.) cap wordconvert "`file'" "`htmlfile'.html",encoding(gb2312) } songbl dir *html ,max(1) } exit } //翻译命令 if "`command'"!="" { tokenize `content' if `"`content'"'==""{ disp as error "varlist required" exit 101 } if "`2'"!=""{ disp as error "varlist not allowed" exit 101 } cap which hlp2html if _rc!=0{ ssc install hlp2html } cap which log2html if _rc!=0{ ssc install log2html } local class `"`content'"' qui hlp2html, fnames(`class') linesize(200) css("./mystyles.css") replace /// erase ti(Stata communication group wechat : songbl_stata) view browse `class'.html songbl dir *html exit } //以下代码改编来自:https://github.com/r-stata/fanyi qui{ //翻译句子 cap preserve clear tempfile temp local len = udstrlen(`"`content'"')+5 percentencode `"`content'"' local b = "`r(percentencode)'" copy "http://www.youdao.com/w/`b'/#keyfrom=dict2.top" "`temp.txt'", replace local times = 0 while _rc != 0{ local times = `times' + 1 sleep 1000 qui cap copy "http://www.youdao.com/w/`b'/#keyfrom=dict2.top" "`temp.txt'", replace if `times' > 10{ di as error "错误!:因为你的网络速度过慢,无法获得数据" exit 601 } } infix strL v 1-20000 using "`temp.txt'", clear keep if index(v[_n+1], "机器翻译") replace v = ustrregexs(1) if ustrregexm(v[1],">(.*)<") replace v = subinstr(v, "'", `"'"', .) local c = v[1] local c = usubinstr("`c'",""","",.) local c = usubinstr("`c'",`"""',"",.) local c = usubinstr("`c'",`"""',"",.) local len = udstrlen(`"`c'"')+10 *di as yellow _dup(`len') "-" if "`c'"!=""{ n di as txt "{hline}" n di as text "【译文】:`c'" *di as yellow _dup(`len') "-" n di as txt "{hline}" ret local result = "`c'" } //翻译单词 else{ foreach word in `content'{ if ustrregexm("`word'", "[\u4e00-\u9fa5]+"){ percentencode "`word'" local a = "`r(percentencode)'" copy "http://cn.bing.com/dict/search?q=`a'&qs=n&form=Z9LH5&sp=-1&pq=`a'&sc=2-2&sk=&cvid=F0EB8DBE335C4C6683304A4D16ECD8FB" "`temp.txt'", replace local times = 0 while _rc != 0{ local times = `times' + 1 sleep 1000 qui cap copy "http://cn.bing.com/dict/search?q=`a'&qs=n&form=Z9LH5&sp=-1&pq=`a'&sc=2-2&sk=&cvid=F0EB8DBE335C4C6683304A4D16ECD8FB" "`temp.txt'", replace if `times' > 10{ di as error "错误!:因为你的网络速度过慢,无法获得数据" exit 601 } } infix strL v 1-20000 using "`temp.txt'", clear keep if index(v, "") replace v = subinstr(v, "网络释义:", "net.", .) set obs 13 gen v2 = _n - 3 gen v3 = _n tostring v2, replace tostring v3, replace replace v2 = "【词语】" if v2 == "-2" replace v2 = "【拼音】" if v2 == "-1" replace v2 = "【英语】" if v2 == "0" replace v3 = "`word'" if v3 == "1" replace v3 = ustrregexs(0) if ustrregexm(v[1],"\[(.*)\]") & v3 == "2" replace v3 = subinstr(v3, "]", "", .) replace v3 = subinstr(v3, "[", "", .) replace v3 = ustrregexs(0) if ustrregexm(v[1], ",[a-z].(.*);") & v3 == "3" replace v3 = subinstr(v3, ",", "", .) gen strL a = v3[3] in 1 moss a, match("([a-z]+\.+?)") regex unicode levelsof _count, local(b) local c = `b' + 3 forval i = 4/`c'{ local j = `i' - 3 replace v2 = _match`j'[1] if v2 == "`j'" } drop if _n > `c' global p = "" forval i = 1/`b'{ global p = "$p" + " " + _match`i' } keep v v2 v3 cap split v3 if v3[_n+1] == "4", parse($p) if _rc!=0{ display as error " 太难了,Stata也不知道怎么翻译" exit 110 } local j = 2 forval i = 4/`c'{ replace v3 = v3`j'[3] if v3 == "`i'" local j = `j' + 1 } replace v3 = "" if v2 == "【英语】" keep v2 v3 rename v2 a rename v3 b replace b = subinstr(b, "2", "", .) format b %-50s compress cap erase "`temp.txt'" forval i = 1/`=_N'{ local temp = a[`i'] if "`temp'" == "【单词】"{ local temp = "word" } if "`temp'" == "【读音】"{ local temp = "prounciation" } if "`temp'" == "【释义】"{ local temp = "means" } n di as text a[`i'] + ":" + b[`i'] } n di "" } else{ copy "http://cn.bing.com/dict/search?q=`word'&qs=n&form=Z9LH5&sp=-1&pq=`word'&sc=7-3&sk=&cvid=E8E3C113211944A69B575B5DA2C9009A" "`temp.txt'", replace local times = 0 while _rc != 0{ local times = `times' + 1 sleep 1000 qui cap copy "http://cn.bing.com/dict/search?q=`word'&qs=n&form=Z9LH5&sp=-1&pq=`word'&sc=7-3&sk=&cvid=E8E3C113211944A69B575B5DA2C9009A" "`temp.txt'", replace if `times' > 10{ di as error "错误!:因为你的网络速度过慢,无法获得数据" exit 601 } } cap unicode encoding set gb18030 cap unicode translate "`temp.txt'" cap unicode erasebackups, badidea infix strL v 1-20000 using "`temp.txt'", clear keep if index(v, "keywords") set obs 13 gen v2 = _n - 3 gen v3 = _n tostring v2, replace tostring v3, replace replace v2 = "【单词】" if v2 == "-2" replace v2 = "【读音】" if v2 == "-1" replace v2 = "【释义】" if v2 == "0" replace v3 = "`word'" if v3 == "1" replace v3 = ustrregexs(0) if ustrregexm(v[1],"美\[(.*)\]") & v3 == "2" replace v = subinstr(v, " ", "", .) replace v3 = ustrregexs(0) if ustrregexm(v[1], ",[a-z].(.*);") & v3 == "3" replace v3 = subinstr(v3, ",", "", .) replace v2 = ustrregexs(2) if ustrregexm(v3[3],"([a-z]+\.+?)") & v2 == "8" gen strL a = v3[3] in 1 moss a, match("([a-z]+\.+?)") regex unicode levelsof _count, local(b) local c = `b' + 3 forval i = 4/`c'{ local j = `i' - 3 replace v2 = _match`j'[1] if v2 == "`j'" } drop if _n > `c' global p = "" forval i = 1/`b'{ global p = "$p" + " " + _match`i' } keep v v2 v3 cap split v3 if v3[_n+1] == "4", parse($p) if _rc!=0{ display as error " 太难了,Stata也不知道怎么翻译" exit 110 } local j = 2 forval i = 4/`c'{ replace v3 = v3`j'[3] if v3 == "`i'" local j = `j' + 1 } replace v3 = "" if v2 == "【释义】" keep v2 v3 rename v2 a rename v3 b format b %-50s compress cap erase "`temp.txt'" if index(b[_N], "网络释义"){ split b if index(b[_N], "网络释义"), parse(网络释义:) } local obs = `c' + 1 set obs `obs' replace a = "net." if a == "" replace b = b2[_n-1] if b == "" replace b = b1 if index(b, "网络释义") keep a b replace b = "`word'" if a == "【单词】" forval i = 1/`=_N'{ local temp = a[`i'] if "`temp'" == "【单词】"{ local temp = "word" } if "`temp'" == "【读音】"{ local temp = "prounciation" } if "`temp'" == "【释义】"{ local temp = "means" } n di as text a[`i'] + ":" + b[`i'] } n di "" _n } } } restore cap erase "`temp.txt'" } end *! URL 转码 cap program drop percentencode program define percentencode, rclass mata: st_local("percentencode", percentencode(`"`1'"')) return local percentencode "`percentencode'" *di "`percentencode'" end mata: string scalar percentencode(string scalar s){ lc = "abcdefghijklmnopqrstuvwxyz" uc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" no = "1234567890" re = "-._~" str = lc + uc + no + re asc = ascii(s)' sel = rowmax(asc :== J(rows(asc), 1, ascii(str))) chr = sel:* strofreal(asc) enc = !sel :* ("%" :+ inbase(16, asc)) final = strupper(chr :+ enc) for(i=1; i<=rows(final); i++) { if (substr(final[i], 1, 1)!="%") { final[i] = char(strtoreal(final[i])) } } return (invtokens(final', "")) } end *! Verion: 1.0 *! Update: 2021/05/30 12:32 *! Verion: 1.01 *! Update: 2021/08/06 05:58 capture program drop songbl_get program define songbl_get, rclass version 14 syntax [anything(name = pkgname)][,REPLACE NOpen Drop(string) ] if `"`pkgname'"'==""{ di as text "请输入获取{bf:dofile}的提取码:" _request(sbldokey) local pkgname "$sbldokey" } /*保存原始dofile链接*/ local original_pkgname=`"`pkgname'"' /*消去dofile链接的双引号*/ local pkgname `pkgname' /*切割dofile链接*/ if strmatch(`"`pkgname'"',"*/*")==1 | strmatch(`"`pkgname'"',"*\*")==1{ local pkgname: subinstr local pkgname "\" "/", all gettoken pkgname other : pkgname, parse("/:") while "`other'" != "" { local path "`path'`pkgname'" gettoken pkgname other : other, parse("/:") } } /*dofile名称如果是.do结尾则删除.do*/ if usubstr("`pkgname'",-3,3) ==".do" { local pkgname =plural(2, "`pkgname'","-.do") } /*如果用户只输入dofile名称,不包含链接。则指定默认路径*/ if strpos(`"`original_pkgname'"',"http")==0{ local URL "https://songbl-1304948727.cos.ap-guangzhou.myqcloud.com/do/" //默认路径 } else{ local URL = "`path'" //切割dofile链接得到的路径 } /*下载的dofile放置到外部命令文件夹*/ local PATH `"`c(sysdir_plus)'"' //外部命令文件夹 local path =substr("`pkgname'",1,1) //dofile名称首字母 local PATH `PATH'\`path'\ //dofile保存的文件夹 capture mkdir `"`PATH'"' //如果文件夹不存在,则生成一个文件夹 local PATH =subinstr("`PATH'","/","\",.) /*检查dofile是否已经下载*/ capture confirm file "`PATH'\`pkgname'.do" //核查dofile是否已经存在于外部命令文件夹 local rc_confirm =_rc capture qui checksum `"`PATH'\`pkgname'.do"' local rc_path =_rc local pathcheck =r(filelen) //核查已存在的dofile文件大小 capture qui checksum "`URL'`pkgname'.do" local rc_url =_rc local urlcheck =r(filelen) //核查待下载的dofile文件大小 /*返回679错误,则表明待下载的dofile文件已经加密*/ if `rc_url' == 679 { di as err `"web error 403"' di as err _col(5) `"The data or document have been encrypted."' di as err _col(5) `"To obtain the key, please contact wechat:{browse "https://note.youdao.com/ynoteshare1/index.html?id=720635d3824de83e0e764a60eb34e54c&type=note":{bf:songbl_stata}}"' exit 679 } /*返回非679错误,则表明待下载的dofile文件不存在*/ if `rc_url'!=679 & `rc_url'!=0{ di as err `"songbl copy: "`pkgname'.do" not found. Please check the dofile link carefully."' exit 601 } dis as text `"checking {bf:`pkgname'.do} consistency and verifying not already installed..."' /*核查dofile是否已经存在于外部命令文件夹*/ if `rc_confirm'==0 & "`replace'"==""{ /*核查文件已存在dofile大小与待下载的dofile文件大小是否一致,不一致则表明dofile文件有更新*/ if `pathcheck'- `urlcheck'!=0{ dis "" dis as text "the following files already exist and are different:" dis as text _col(5) `"{stata `"doedit `"`PATH'\`pkgname'.do"'"':{bf:`PATH'\`pkgname'.do}}"' dis "" dis as err "no files installed or downloaded" dis as err _col(4) `"{stata `"songbl_get `original_pkgname',replace"':{bf: Force download replacing already-downloaded files}}"' dis as err "(no action taken)" if "`nopen'"==""{ doedit `"`PATH'\`pkgname'.do"' } /*返回dofile文件的名称与保存路径*/ return local filename `"`pkgname'.do"' return local path `"`PATH'"' return local adofile `"`PATH'\`pkgname'.do"' exit 602 } /*一致则表明dofile文件没有更新*/ else{ dis as text _col(5) `"{stata `"doedit `"`PATH'\`pkgname'.do"'"':{bf:`PATH'\`pkgname'.do}} already exist and are up to date."' if "`nopen'"==""{ doedit `"`PATH'\`pkgname'.do"' } /*返回dofile文件的名称与保存路径*/ return local filename `"`pkgname'.do"' return local path `"`PATH'"' return local adofile `"`PATH'\`pkgname'.do"' exit } } dis "" dis as text "the following files will be replaced:" dis as text _col(5) `"{stata `"doedit "`PATH'\`pkgname'.do""':{bf:`PATH'\`pkgname'.do}}"' _n dis as text "installing into `PATH'..." /*下载的dofile文件*/ capture copy "`URL'`pkgname'.do" `"`PATH'\`pkgname'.do"',replace local times = 0 while _rc ~= 0 { local times = `times' + 1 sleep 1000 capture copy "`URL'`pkgname'.do" `"`PATH'\`pkgname'.do"',replace if `times' > 10 { disp as error "Internet speeds is too low to get the dofile" exit 601 } } if "`no'"==""{ doedit `"`PATH'\`pkgname'.do"' } /*返回dofile文件的名称与保存路径*/ return local filename `"`pkgname'.do"' return local path `"`PATH'"' return local adofile `"`PATH'\`pkgname'.do"' end *! Verion: 1.0 *! Update: 2021/5/30 12:32 cap program drop songbl_dir program define songbl_dir version 14 syntax [anything(name = paper)][,Cls Gap Line NOCAT MAXdeep(numlist integer max=1 min=1 >0 <10 ) Drop(string) FY ] preserve qui{ if "`cls'" != ""{ cls dis "" } if "`fy'" != ""{ if "`nocat'"==""{ n dis as erro `"{browse "`c(pwd)'":{bf:>>}}"' `" {bf:Current Working Directory}"' } fs *.pdf foreach file in `r(files)'{ n dis _col(4) in txt `"{stata `"songbl fy "`file'",pdf"':Translate }"' "`file'" exit } } cap which filelist if _rc!=0{ ssc install filelist } tempfile tempdata2 tempdata3 tempdata4 tempdata5 tempdata6 tempdata7 tempdata8 tempdata9 //可以打印8层文件夹 if "`maxdeep'"!=""{ local maxdeep ="maxdeep(`maxdeep')" } if "`gap'" != "" { local gap dis "" } n dis "" local root_files `c(pwd)' *cap filelist , `pattern' `maxdeep' if `"`paper'"'==""{ cap filelist , `maxdeep' } else{ local i = 1 foreach class of local paper{ tempfile class`i' local pattern ="pattern(`class')" cap filelist , `pattern' `maxdeep' save "`class`i''",replace local ++i } local n : word count `paper' use "`class1'",clear if `n'>1{ forvalues i = 2/`n'{ capture append using "`class`i''" } } } gettoken s1 s2: drop, parse(" ") while "`s1'" !="`s2'" { gettoken s1 s2: drop, parse(" ") drop if strmatch(filename,"`s1'") local drop ="`s2'" } drop if strmatch(filename,"~*") count local Number_of_files_found = r(N) if _rc==601 { local RC=601 *filelist , `pattern' } replace dirname=substr(dirname,2,.) gen url="`root_files'"+dirname+"/"+filename cap split dirname,p("/") if _rc!=0{ if `Number_of_files_found'==0{ n dis as erro "没有搜索到相关文件" exit 601 } else{ if "`nocat'"==""{ n dis as erro `"{browse "`root_files'":{bf:>>}}"' `" {bf:Current Working Directory}"' } sort filename local n=_N forvalues i = 1/`n'{ local url=url[`i'] local filename=filename[`i'] if usubstr("`url'",-3,3) ==".do" | usubstr("`url'",-4,4) ==".ado" | /// usubstr("`url'",-4,4) ==".hlp"| usubstr("`url'",-6,6) ==".sthlp" { if "`line'"!=""{ n dis _col(4) in txt `"{stata `"doedit `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(4) `"{stata `"doedit `"`url'"'"':`filename'}"' } } else if usubstr("`url'",-4,4) ==".dta"{ if "`line'"!=""{ n dis _col(4) in txt `"{stata `"use `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(4) `"{stata `"use `"`url'"'"':`filename'}"' } } else{ if "`line'"!=""{ n dis _col(4) in txt `"{browse `"`url'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(4) `"{browse `"`url'"':`filename'}"' } } n `gap' } if "`RC'"==""{ local RC = 600 } if `RC'==601{ filelist , `pattern' } exit } } ds dirname* local n : word count `r(varlist)' save "`tempdata2'",replace if "`nocat'"==""{ n dis as erro `"{browse "`root_files'":{bf:>>}}"' `" {bf:Current Working Directory}"' } cap keep if dirname2=="" sort filename local n=_N forvalues i = 1/`n'{ local url=url[`i'] local filename=filename[`i'] if usubstr("`url'",-3,3) ==".do" | usubstr("`url'",-4,4) ==".ado" | /// usubstr("`url'",-4,4) ==".hlp"| usubstr("`url'",-6,6) ==".sthlp" { if "`line'"!=""{ n dis _col(4) in txt `"{stata `"doedit `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(4) `"{stata `"doedit `"`url'"'"':`filename'}"' } } else if usubstr("`url'",-4,4) ==".dta"{ if "`line'"!=""{ n dis _col(4) in txt `"{stata `"use `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(4) `"{stata `"use `"`url'"'"':`filename'}"' } } else{ if "`line'"!=""{ n dis _col(4) in txt `"{browse `"`url'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(4) `"{browse `"`url'"':`filename'}"' } } n `gap' } use "`tempdata2'", clear cap levelsof dirname2, local(dirname2) foreach dirname2 in `dirname2' { use "`tempdata2'", clear cap keep if dirname2=="`dirname2'" if "`nocat'"==""{ n dis "" } *else{ * n dis "" _n *} if "`nocat'"==""{ n dis as erro _col(4) `"{browse "`root_files'/`dirname2'":{bf:>>}}"' `" {bf:`dirname2'}"' } cap keep if dirname3=="" sort filename local n=_N forvalues i = 1/`n'{ local url=url[`i'] local filename=filename[`i'] if usubstr("`url'",-3,3) ==".do" | usubstr("`url'",-4,4) ==".ado" | /// usubstr("`url'",-4,4) ==".hlp"| usubstr("`url'",-6,6) ==".sthlp" { if "`line'"!=""{ n dis _col(7) in txt `"{stata `"doedit `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(7) `"{stata `"doedit `"`url'"'"':`filename'}"' } } else if usubstr("`url'",-4,4) ==".dta"{ if "`line'"!=""{ n dis _col(7) in txt `"{stata `"use `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(7) `"{stata `"use `"`url'"'"':`filename'}"' } } else{ if "`line'"!=""{ n dis _col(7) in txt `"{browse `"`url'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(7) `"{browse `"`url'"':`filename'}"' } } n `gap' } use "`tempdata2'", clear cap keep if dirname2=="`dirname2'" cap levelsof dirname3, local(dirname3) if _rc==0{ save "`tempdata3'",replace foreach dirname3 in `dirname3' { use "`tempdata3'", clear cap keep if dirname3=="`dirname3'" if "`nocat'"==""{ n dis as erro _col(7) `"{browse "`root_files'/`dirname2'/`dirname3'":{bf:>>}}"' `" {bf:`dirname3'}"' } cap keep if dirname4=="" sort filename local n=_N forvalues i = 1/`n'{ local url=url[`i'] local filename=filename[`i'] if usubstr("`url'",-3,3) ==".do" | usubstr("`url'",-4,4) ==".ado" | /// usubstr("`url'",-4,4) ==".hlp"| usubstr("`url'",-6,6) ==".sthlp" { if "`line'"!=""{ n dis _col(10) in txt `"{stata `"doedit `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(10) `"{stata `"doedit `"`url'"'"':`filename'}"' } } else if usubstr("`url'",-4,4) ==".dta"{ if "`line'"!=""{ n dis _col(10) in txt `"{stata `"use `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(10) `"{stata `"use `"`url'"'"':`filename'}"' } } else{ if "`line'"!=""{ n dis _col(10) in txt `"{browse `"`url'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(10) `"{browse `"`url'"':`filename'}"' } } n `gap' } use "`tempdata3'", clear cap keep if dirname3=="`dirname3'" cap levelsof dirname4, local(dirname4) if _rc==0{ save "`tempdata4'",replace foreach dirname4 in `dirname4' { use "`tempdata4'", clear cap keep if dirname4=="`dirname4'" if "`nocat'"==""{ n dis as erro _col(10) `"{browse "`root_files'/`dirname2'/`dirname3'/`dirname4'":{bf:>>}}"' `" {bf:`dirname4'}"' } cap keep if dirname5=="" sort filename local n=_N forvalues i = 1/`n'{ local url=url[`i'] local filename=filename[`i'] if usubstr("`url'",-3,3) ==".do" | usubstr("`url'",-4,4) ==".ado" | /// usubstr("`url'",-4,4) ==".hlp"| usubstr("`url'",-6,6) ==".sthlp" { if "`line'"!=""{ n dis _col(13) in txt `"{stata `"doedit `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(13) `"{stata `"doedit `"`url'"'"':`filename'}"' } } else if usubstr("`url'",-4,4) ==".dta"{ if "`line'"!=""{ n dis _col(13) in txt `"{stata `"use `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(13) `"{stata `"use `"`url'"'"':`filename'}"' } } else{ if "`line'"!=""{ n dis _col(13) in txt `"{browse `"`url'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(13) `"{browse `"`url'"':`filename'}"' } } n `gap' } use "`tempdata4'", clear cap keep if dirname4=="`dirname4'" cap levelsof dirname5, local(dirname5) if _rc==0{ save "`tempdata5'",replace foreach dirname5 in `dirname5' { use "`tempdata5'", clear cap keep if dirname5=="`dirname5'" if "`nocat'"==""{ n dis as erro _col(13) `"{browse "`root_files'/`dirname2'/`dirname3'/`dirname4'/`dirname5'":{bf:>>}}"' `" {bf:`dirname5'}"' } cap keep if dirname6=="" sort filename local n=_N forvalues i = 1/`n'{ local url=url[`i'] local filename=filename[`i'] if usubstr("`url'",-3,3) ==".do" | usubstr("`url'",-4,4) ==".ado" | /// usubstr("`url'",-4,4) ==".hlp"| usubstr("`url'",-6,6) ==".sthlp" { if "`line'"!=""{ n dis _col(16) in txt `"{stata `"doedit `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(16) `"{stata `"doedit `"`url'"'"':`filename'}"' } } else if usubstr("`url'",-4,4) ==".dta"{ if "`line'"!=""{ n dis _col(16) in txt `"{stata `"use `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(16) `"{stata `"use `"`url'"'"':`filename'}"' } } else{ if "`line'"!=""{ n dis _col(16) in txt `"{browse `"`url'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(16) `"{browse `"`url'"':`filename'}"' } } n `gap' } use "`tempdata5'", clear cap keep if dirname5=="`dirname5'" cap levelsof dirname6, local(dirname6) if _rc==0{ save "`tempdata6'",replace foreach dirname6 in `dirname6' { use "`tempdata6'", clear cap keep if dirname6=="`dirname6'" if "`nocat'"==""{ n dis as erro _col(16) `"{browse "`root_files'/`dirname2'/`dirname3'/`dirname4'/`dirname5'/`dirname6'":{bf:>>}}"' `" {bf:`dirname6'}"' } cap keep if dirname7=="" sort filename local n=_N forvalues i = 1/`n'{ local url=url[`i'] local filename=filename[`i'] if usubstr("`url'",-3,3) ==".do" | usubstr("`url'",-4,4) ==".ado" | /// usubstr("`url'",-4,4) ==".hlp"| usubstr("`url'",-6,6) ==".sthlp" { if "`line'"!=""{ n dis _col(19) in txt `"{stata `"doedit `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(19) `"{stata `"doedit `"`url'"'"':`filename'}"' } } else if usubstr("`url'",-4,4) ==".dta"{ if "`line'"!=""{ n dis _col(19) in txt `"{stata `"use `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(19) `"{stata `"use `"`url'"'"':`filename'}"' } } else{ if "`line'"!=""{ n dis _col(19) in txt `"{browse `"`url'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(19) `"{browse `"`url'"':`filename'}"' } } n `gap' } use "`tempdata6'", clear cap keep if dirname6=="`dirname6'" cap levelsof dirname7, local(dirname7) if _rc==0{ save "`tempdata7'",replace foreach dirname7 in `dirname7' { use "`tempdata7'", clear cap keep if dirname7=="`dirname7'" if "`nocat'"==""{ n dis as erro _col(19) `"{browse "`root_files'/`dirname2'/`dirname3'/`dirname4'/`dirname5'/`dirname6'/`dirname7'":{bf:>>}}"' `" {bf:`dirname7'}"' } cap keep if dirname8=="" sort filename local n=_N forvalues i = 1/`n'{ local url=url[`i'] local filename=filename[`i'] if usubstr("`url'",-3,3) ==".do" | usubstr("`url'",-4,4) ==".ado" | /// usubstr("`url'",-4,4) ==".hlp"| usubstr("`url'",-6,6) ==".sthlp" { if "`line'"!=""{ n dis _col(22) in txt `"{stata `"doedit `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(22) `"{stata `"doedit `"`url'"'"':`filename'}"' } } else if usubstr("`url'",-4,4) ==".dta"{ if "`line'"!=""{ n dis _col(22) in txt `"{stata `"use `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(22) `"{stata `"use `"`url'"'"':`filename'}"' } } else{ if "`line'"!=""{ n dis _col(22) in txt `"{browse `"`url'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(22) `"{browse `"`url'"':`filename'}"' } } n `gap' } use "`tempdata7'", clear cap keep if dirname7=="`dirname7'" cap levelsof dirname8, local(dirname8) if _rc==0{ save "`tempdata8'",replace foreach dirname8 in `dirname8' { use "`tempdata8'", clear cap keep if dirname8=="`dirname8'" if "`nocat'"==""{ n dis as erro _col(22) `"{browse "`root_files'/`dirname2'/`dirname3'/`dirname4'/`dirname5'/`dirname6'/`dirname7'/`dirname8'":{bf:>>}}"' `" {bf:`dirname8'}"' } cap keep if dirname9=="" sort filename local n=_N forvalues i = 1/`n'{ local url=url[`i'] local filename=filename[`i'] if usubstr("`url'",-3,3) ==".do" | usubstr("`url'",-4,4) ==".ado" | /// usubstr("`url'",-4,4) ==".hlp"| usubstr("`url'",-6,6) ==".sthlp" { if "`line'"!=""{ n dis _col(25) in txt `"{stata `"doedit `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(25) `"{stata `"doedit `"`url'"'"':`filename'}"' } } else if usubstr("`url'",-4,4) ==".dta"{ if "`line'"!=""{ n dis _col(25) in txt `"{stata `"use `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(25) `"{stata `"use `"`url'"'"':`filename'}"' } } else{ if "`line'"!=""{ n dis _col(25) in txt `"{browse `"`url'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(25) `"{browse `"`url'"':`filename'}"' } } n `gap' } use "`tempdata8'", clear cap keep if dirname8=="`dirname8'" cap levelsof dirname9, local(dirname9) if _rc==0{ save "`tempdata9'",replace foreach dirname9 in `dirname9' { use "`tempdata9'", clear cap keep if dirname9=="`dirname9'" if "`nocat'"==""{ n dis as erro _col(25) `"{browse "`root_files'/`dirname2'/`dirname3'/`dirname4'/`dirname5'/`dirname6'/`dirname7'/`dirname8'/`dirname9'":{bf:>>}}"' `" {bf:`dirname9'}"' } cap keep if dirname10=="" sort filename local n=_N forvalues i = 1/`n'{ local url=url[`i'] local filename=filename[`i'] if usubstr("`url'",-3,3) ==".do" | usubstr("`url'",-4,4) ==".ado" | /// usubstr("`url'",-4,4) ==".hlp"| usubstr("`url'",-6,6) ==".sthlp" { if "`line'"!=""{ n dis _col(28) in txt `"{stata `"doedit `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(28) `"{stata `"doedit `"`url'"'"':`filename'}"' } } else if usubstr("`url'",-4,4) ==".dta"{ if "`line'"!=""{ n dis _col(28) in txt `"{stata `"use `"`url'"'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(28) `"{stata `"use `"`url'"'"':`filename'}"' } } else{ if "`line'"!=""{ n dis _col(28) in txt `"{browse `"`url'"':{bf:-}}"' `" `filename'"' } else{ n dis _col(28) `"{browse `"`url'"':`filename'}"' } } n `gap' } use "`tempdata9'", clear cap keep if dirname8=="`dirname9'" } } } } } } } } } } } } } } } if "`RC'"==""{ local RC = 600 } if `RC'==601{ filelist , `pattern' } } restore end cap program drop songbl_cie program define songbl_cie version 14 syntax [anything(name = class)] [, CLS Gap NOreplace] preserve qui{ if "`cls'" != ""{ cls dis "" } if "`gap'" != "" { local gap dis "" } if "`class'"==""{ local path https://songbl-1304948727.cos.ap-guangzhou.myqcloud.com local URL "`path'/navigation" n songbl_links ,url(`URL'/cie.txt) exit exit } cap which carryforward if _rc!=0{ qui ssc install carryforward,replace } tempfile html_text text local url https://note.youdao.com/yws/api/personal/file/A591767E58A84994B25171581E136448?method=download&shareKey=a00a0dca31ca8cd8025a890286f08cc3 cap copy `"`url'"' `"`html_text'.txt"', replace if _rc ~= 0 { local url https://songbl-1304948727.cos.ap-guangzhou.myqcloud.com/cie.txt cap copy `"`url'"' `"`html_text'.txt"', replace } local times = 0 while _rc ~= 0 { local times = `times' + 1 sleep 1000 cap copy `"`url'"' `"`html_text'.txt"', replace if `times' > 10 { disp as error "Internet speeds is too low to get the data" exit 601 } } infix strL v 1-100000 using `"`html_text'.txt"', clear cap erase `"`html_text'.txt"' replace v = lower(v) local o_class= "`class'" local class = lower("`class'") gen n=_n gen title=v if index(v[_n-1],"**#论文标题:") replace title=title[_n+10] gen id=n if index(v[_n+9],"**#论文标题:") carryforward title id,replace gen sort = _n save "`text'.dta",replace duplicates drop id,force drop if id ==. gen num =_n keep id num merge 1:m id using "`text'.dta" cap drop "`text'.dta" sort sort tostring num ,replace gen cie="cie"+num keep if strmatch(v,`"*`class'*"') capture duplicates drop id, force if _rc!=0{ dis as error "《中国工业经济》代码没有发现相关内容" exit } local n=_N n dis as w `" 代码 >>"' `"{stata "songbl `class',cie save(txt)": 详细检索}"' forvalues i =1/`n'{ local cie = cie[`i'] local title = title[`i'] if "`noreplace'"==""{ n dis in text _col(4) "{stata qui songbl get `cie',replace:`title'}" } else{ n dis in text _col(4) "{stata qui songbl get `cie':`title'}" } n `gap' } n dis "" n dis in red _col(4)"检索到`n'篇存在 {bf:`o_class'} 关键词的do文档" exit } restore end **如何把excel数据批量转为stata数据 cap prog drop songbl_excel prog define songbl_excel version 14 syntax [anything] [,Firstrow REPLACE FRAME] qui{ local a=1 local e=1 local files: dir "." file "*.xlsx", respectcase foreach file in `files' { cap import excel using "`file'", describe if _rc!=0{ local e`e'="`file'" local e=`e'+1 continue } forvalues i = 1/`r(N_worksheet)' { import excel using "`file'", describe cap import excel using "`file'" , /// sheet(`r(worksheet_`i')') /// cellrange(`r(range_`i')') /// `firstrow' clear import excel using "`file'", describe local name=subinstr("`file'--`r(worksheet_`i')'",".xlsx","",.) if `r(N_worksheet)'==1 | "`r(range_2)'"==""{ local name=subinstr("`file'",".xlsx","",.) } if "`frame'"!=""{ cap frame copy default `name' if _rc!=0{ cap frame copy default "songbl_`name'" } } else{ save "`name'.dta",`replace' } local j=`i'+1 if "`r(range_`j')'"==""{ continue, break } } n dis "." _c local a=`a'+1 } local files: dir "." file "*.xls", respectcase foreach file in `files' { cap import excel using "`file'", describe if _rc!=0{ local e`e'="`file'" local e=`e'+1 *erase "`file'" continue } forvalues i = 1/`r(N_worksheet)' { import excel using "`file'", describe cap import excel using "`file'" , /// sheet(`r(worksheet_`i')') /// cellrange(`r(range_`i')') /// `firstrow' clear import excel using "`file'", describe local name=subinstr("`file'--`r(worksheet_`i')'",".xls","",.) if `r(N_worksheet)'==1 | "`r(range_2)'"==""{ local name=subinstr("`file'",".xls","",.) } if "`frame'"!=""{ cap frame copy default `name' if _rc!=0{ cap frame copy default "songbl_`name'" } } else{ save "`name'.dta",`replace' } local j=`i'+1 if "`r(range_`j')'"==""{ continue, break } } n dis "." _c local a=`a'+1 } if `e'!=1{ n dis "" _n local e =`e'-1 n dis as err "The following `e' sets of data could not be loaded into STATA" forvalues i =1/`e'{ n dis as err "`e`i''" } } } if missing("`frame'"){ songbl dir *.dta, max(1) } end