如何用Python或其他工具转换格式混乱的.dat文件为.csv文件?
旧版CPS .dat文件转CSV的实用方法
这类2019年前的.dat文件本质是固定宽度格式文件,不是靠分隔符分割的,所以不能直接按空格/逗号拆分,得用对应年份的字段布局(数据字典)来解析,以下是两种靠谱的解决方案:
Python 实现(推荐)
用pandas的read_fwf专门处理固定宽度文件,步骤如下:
- 先找到对应年份的CPS数据字典(Record Layout),里面会明确每个字段的起始位置、长度、数据类型(比如AGE字段占4位、从第1位到第4位)。
- 编写代码解析并转换:
import pandas as pd # 示例:根据数据字典定义字段名和对应宽度(实际要替换成目标年份的真实布局) field_specs = [ ('AGE', 4), ('HOUSEHOLD_INCOME', 8), ('INTERNET_ACCESS', 1), ('EDUCATION', 2) ] # 生成pandas需要的列位置参数(起始索引,结束索引) col_specs = [] prev_end = 0 for name, length in field_specs: col_specs.append((prev_end, prev_end + length)) prev_end += length # 读取.dat文件,指定缺失值标记 df = pd.read_fwf( 'your_old_cps_data.dat', colspecs=col_specs, names=[name for name, _ in field_specs], na_values=['-', ' ', 'NaN'] ) # 处理特殊负数格式(比如部分文件用(123)表示-123) df = df.replace(r'\((\d+)\)', r'-\1', regex=True) # 转换为数值类型,无法转换的设为NaN df = df.apply(pd.to_numeric, errors='coerce') # 保存为CSV df.to_csv('converted_cps_data.csv', index=False)
如果数据字典是可读取的文本文件,还可以写个小脚本自动提取字段位置,不用手动写field_specs。
其他工具方案
- Stata:用
infix命令按字段位置读取,再导出CSV:
infix AGE 1-4 HOUSEHOLD_INCOME 5-12 INTERNET_ACCESS 13-13 EDUCATION 14-15 using "old_cps_data.dat" save "temp_stata_data.dta", replace export delimited using "converted_cps_data.csv", replace
- OpenRefine:适合非编程用户,导入.dat文件后选择「固定宽度分割」,手动拖动分隔线或输入每个字段的宽度,确认后直接导出为CSV。
- SAS:通过
infile和input语句指定字段宽度读取,再用proc export导出CSV。
注意:每个年份的CPS字段布局可能有差异,必须使用对应年份的数据字典,不能混用。
内容的提问来源于stack exchange,提问作者Thanh Nguyen
相关产品推荐
相关产品推荐

