如何拆分网页爬取CSV的嵌套字段导入Stata保存为.dta格式
Stata拆分非结构化JSON字段操作方案
你导入的CSV中v22、v23字段是爬虫未做结构化解析的JSON格式字符串,Stata 14及以上版本无需安装第三方包即可完成字段提取,具体操作如下:
提取creator字段(v22)的独立id、name列
先确认v22单元格内容为标准JSON结构(格式类似{"id":123456,"name":"创作者昵称",...其他冗余字段}),根据你的Stata版本选对应代码运行即可:
- 适配Stata 14及以上所有版本(正则匹配写法,无版本依赖)
* 提取创作者数字id gen creator_id = ustrregexs(1) if ustrregexm(v22, `"id":([0-9]+)"') destring creator_id, replace * 提取创作者名称,自动兼容带转义字符的文本 gen creator_name = ustrregexs(1) if ustrregexm(v22, `"name":"([^"\\]*(\\.[^"\\]*)*)"')
- 适配Stata 16及以上版本(官方JSON解析函数写法,容错率更高,不会受字段顺序、特殊字符干扰)
gen creator_id = json_extract_string(v22, "$.id") destring creator_id, replace gen creator_name = json_extract_string(v22, "$.name")
提取位置字段(v23)的独立name、state、short_name列
提取逻辑和creator字段完全一致:
- 适配Stata 14及以上所有版本
gen location_name = ustrregexs(1) if ustrregexm(v23, `"name":"([^"\\]*(\\.[^"\\]*)*)"') gen location_state = ustrregexs(1) if ustrregexm(v23, `"state":"([^"\\]*(\\.[^"\\]*)*)"') gen location_short_name = ustrregexs(1) if ustrregexm(v23, `"short_name":"([^"\\]*(\\.[^"\\]*)*)"')
- 适配Stata 16及以上版本
gen location_name = json_extract_string(v23, "$.name") gen location_state = json_extract_string(v23, "$.state") gen location_short_name = json_extract_string(v23, "$.short_name")
操作注意事项
- 运行提取代码前先备份原始数据集,避免误操作覆盖原始字段
- 若提取后部分行结果为空,先抽查对应行的原始字段内容,大概率是原始数据本身存在字段缺失(比如部分众筹项目未填写位置所属州信息),不属于代码报错
- 若字段内包含大量转义引号、特殊符号,优先使用高版本的官方JSON解析函数,正则写法在极端特殊字符场景下可能出现匹配偏差
- 所有字段提取校验完成后,直接运行
save 自定义数据集名称.dta, replace即可导出为标准.dta格式文件
内容的提问来源于stack exchange,提问作者Juno Oh
相关产品推荐
相关产品推荐

