今天给大家分享使用 Stata 读取超大的 dta 和 csv 文件的方法。特别是超过电脑内存大小的数据文件。
超大 dta 文件的读取 如果 dta 的文件大小超过了电脑内存,那么大概率就会报错,也就是类似下面的错误信息:
op. sys. refuses to provide memory
不过好在 Stata 的 use 命令可以每次读取部分行:
use [varlist ] [if ] [in ] using filename [, clear nolabel]
例如每次读 100 条:
use in 1/100 using 文件名.dta, clear
通常一次读个 100 万条问题不大(当然具体也得看数据的实际情况),不过读取最后一部分的时候需要知道文件的总行数。
获取文件的总行数可以使用 describe 命令,该命令有种用法是:
describe [varlist] using filename [, file_options]
这样就可以分批读取,删除不需要的变量,或者汇总之后再合并。
例如获取某个工商注册数据的总行数:
desc using 2017.dta *> Contains data 数据处理:微信公众号 *> RStata *> Observations: 19,358,503 14 Jan 2025 02:06 *> Variables: 48 *> ------------------------------------------------------------------------------------------------ *> Variable Storage Display Value *> name type format label Variable label *> ------------------------------------------------------------------------------------------------ *> newgcid str12 %12s *> 企业名称 str273 %273s *> 成立日期 int %tdCY-N-D *> 注册资本 double %10.0g 外币根据2025年1月的汇率转换成了人民币 *> 实缴资本 double %10.0g 外币根据2025年1月的汇率转换成了人民币 *> 行业门类 str48 %10s GB_T4754_2017 *> 行业门类代码 str1 %10s GB_T4754_2017 *> 行业大类 str60 %10s GB_T4754_2017 *> 行业大类代码 str3 %10s GB_T4754_2017 *> 行业中类 str63 %10s GB_T4754_2017 *> 行业中类代码 str4 %10s GB_T4754_2017 *> 行业小类 str48 %10s GB_T4754_2017 *> 行业小类代码 str5 %10s GB_T4754_2017 *> 省份 str24 %10s *> 城市 str33 %10s *> 区县 str45 %10s *> 法人代表 str136 %136s *> 经营状态 str43 %10s *> 统一社会信用代码 *> str18 %10s 进行了大写化处理 *> 工商注册号 str63 %10s 进行了大写化处理 *> 纳税人识别号 str18 %10s 进行了大写化处理 *> 组织机构代码 str10 %10s 进行了大写化处理 *> 企业类型 str111 %111s *> 登记机关 str162 %162s *> 营业期限 str37 %10s *> 纳税人资质 str48 %10s *> 人员规模 str14 %10s *> 参保人数 str11 %10s *> 曾用名 str798 %10s *> 英文名 str83 %83s *> 注册地址 str548 %10s *> 经营范围 strL %10s *> 邮箱 str104 %104s *> 标签 str69 %10s *> 成立年份 int %10.0g *> 经度 double %10.0g *> 纬度 double %10.0g *> 省 str24 %10s 根据经纬度判断的结果 *> 省代码 str6 %10s 根据经纬度判断的结果 *> 市 str33 %10s 根据经纬度判断的结果 *> 市代码 str6 %10s 根据经纬度判断的结果 *> 县 str45 %10s 根据经纬度判断的结果 *> 县代码 str6 %10s 根据经纬度判断的结果 *> 核准日期 int %tdCY-N-D *> 英文名称 str123 %10s *> 法定代表人 str228 %10s *> 公司规模 str14 %10s *> 网址 str1 %10s *> ------------------------------------------------------------------------------------------------ *> Sorted by: newgcid
例如统计每一年文件的观测值数量可以使用下面的循环:
clear mat a = J(11, 2, .) local j = 1 forval y = 2010/2020 { desc using "`y'.dta" mat a[`j', 2] = r(N) mat a[`j', 1] = `y' local j = `j' + 1 } mat list a *> a[11,2] *> c1 c2 *> r1 2010 8375274 *> r2 2011 8947657 *> r3 2012 9272274 *> r4 2013 11185820 *> r5 2014 12402274 *> r6 2015 14615706 *> r7 2016 16566272 *> r8 2017 19358503 *> r9 2018 19743915 *> r10 2019 22280500 *> r11 2020 20696938 svmat a ren a1 year ren a2 n
超大 csv 文件的读取 超大 csv 文件的读取方法类似,import delimited 也可以一次读取部分行:
import delimited [using] filename [, import_delimited_options] import_delimited_options Description rowrange([start][:end]) row range of data to load colrange([start][:end]) column range of data to load
同样,最重要的还是知道总文件的行数,可以用下面的代码。例如 2010.csv 文件:
file open myfile using "2010.csv", read file read myfile line local lines = 0 while r(eof) == 0 { local lines = `lines' + 1 file read myfile line } file close myfile display `lines' *> 916698
然后就可以分批次读取了,例如读取 1-10000 行:
import delimited using 2010.csv, rowrange(1:10000) clear
点击这里跳转到 RStata 短书平台获取附件:Stata 如何读取超大的 dta 和 csv 文件
评论