本文作者:李朋冲
文字编辑:李朋冲
技术总编:刘洪儒
有问题,不要怕!点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~
爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~
好消息:爬虫俱乐部隆重推出数据定制及处理业务啦,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部高级会员为您排忧解难!
在推文《电脑连过的WiFi的密码,都在这里(一)》中,有读者反映,中文WiFi名称有乱码问题,在此我们进行更正:
把wifi.txt导入到Stata之后,需要进行转码:
infix strL v 1-1000 using wifi.txt,clear
replace v = ustrfrom(v,"gb18030",1)
关于转码的详细介绍,请见爬虫俱乐部的推文:《识得庐山真面目—转码方法总结》
在上篇获取WiFi的名称和其密码中,我们主要使用了post命令和循环将WiFi的名称和其密码输出,相信大家对于Stata调用cmd时频繁闪烁的蓝色界面印象深刻——闪动的次数越多,说明你的电脑连接过的WiFi越多。
当cmd窗口频繁闪烁的时候,我们的电脑无法再进行其它操作,有没有办法减少它的闪动,顺便保护我们的眼睛呢?
当然有,下面我们要讲的方法是:
获取所有WiFi的配置信息,将其导入到txt文档之中,然后再进行数据处理
程序及注释如下:
clear
cap mkdir d:/wifi
cd d:/wifi
cap rm 1.txt
!for /f "skip=10 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') ///
do @echo %j | netsh wlan show profiles %j key=clear >> 1.txt
注意:
1. 在推文《电脑连过的WiFi的密码,都在这里(一)》中,对该段程序
for /f "skip=10 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j 的功能有过介绍:获取WiFi的名称。
2. “|”是管道符,其功能是将上一个命令的输出(WiFi名称),作为下一个命令的输入。
运行该行程序,我们可以得到电脑所连接过的所有WiFi的配置信息,将其放入到1.txt之中,内容如下图所示(部分截取)。

replace v = ustrfrom(v,"gb18030",1) //转码
keep if ustrregexm(v,"(?<!\s)名称|关键内容") //使用正则表达式ustrregexm进行匹配,如果某行观测值含有“名称”或“关键内容”,则匹配成功,保留该行(其中,“名称”左边非空)。

forvalue i = `=_N'(-1)1 {
if !index(v[`i'],"关键内容") & index(v[`i'-1],"名称") {
drop in `=`i'-1'
}
}
注意:“=_N”表示总的观测值个数,上述循环从最后一行开始,一直运行到第1行。如果第i行不含有“关键内容”且第i-1行含有“名称”,则删除第i-1行。如第20行不含有“关键内容”且第19行含有“名称”,则删除第19行(如上图所示)。
下面进行WiFi名称和其密码的提取:
replace v = ustrregexs(1) if ustrregexm(v,":(.+)") //用正则表达式提取“:”后第一个子字符串的内容,即WiFi名称和其密码。
gen v1 = v[_n+1]
keep if mod(_n,2) == 1
rename v* (wifiname key) //将v和v1重命名为wifiname和key,结果如下(部分截取)。

完整程序如下:
clear
cap mkdir d:/wifi
cd d:/wifi
cap rm 1.txt
!for /f "skip=10 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') ///
do @echo %j | netsh wlan show profiles %j key=clear >> 1.txt
infix strL v 1-10000 using 1.txt,clear
replace v = ustrfrom(v,"gb18030",1)
keep if ustrregexm(v,"(?<!\s)名称|关键内容")
forvalue i = `=_N'(-1)1 {
if !index(v[`i'],"关键内容") & index(v[`i'-1],"名称") {
drop in `=`i'-1'
}
}
replace v = ustrregexs(1) if ustrregexm(v,":(.+)")
gen v1 = v[_n+1]
keep if mod(_n,2) == 1
rename v* (wifiname key)
至此,我们介绍完了两种一次性找到电脑连过的WiFi名称和其密码的方法,希望可以帮助您管理您的WiFi密码。如果各位读者还有其他的方法,可以给我们留言或者发邮件,爬虫俱乐部热烈欢迎您的参与!

对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”,目前第五批发票已经寄到各位读者的手中。用心做事,只为做您更贴心的小爬虫!
往期推文推荐:
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


