Stata 如何读取超大的 dta 和 csv 文件

今天给大家分享使用 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 文件

评论