基于SAS脚本在R中读取CDC免疫数据.dat文件遇错求助
解决CDC NIS数据读取错误并转换为易用格式
错误原因
zero-length pattern错误源于SAScii包解析SAS输入文件(.sas)时,遇到了不规范的注释格式(比如未闭合的/* */注释、嵌套注释,或者注释写法不符合包的处理逻辑)。
可行解决方案
方案1:清理SAS输入文件后重试SAScii
- 下载目标
.sas文件到本地 - 用文本编辑器打开,清理所有注释:
- 删除所有
/* */包裹的内容 - 移除以
*开头的注释行 - 确保无嵌套注释或未闭合的注释块
- 删除所有
- 调用
read.SAScii读取本地文件:library(SAScii) read.SAScii("本地路径/nispuf14.dat", "本地路径/清理后的nispuf14.sas", zipped = FALSE)
方案2:用readr手动解析固定宽度数据
如果SAScii仍报错,可直接提取SAS文件中的字段定义,用read_fwf读取:
- 从
.sas文件的input语句中提取每个变量的起始位置、结束位置和变量名。例如SAS输入语句通常格式为:input VAR1 1-2 VAR2 3-5 VAR3 6-10;
- 整理成
readr可识别的格式并读取:library(readr) # 根据SAS文件提取的字段信息填写 col_pos <- fwf_positions( start = c(1, 3, 6), end = c(2, 5, 10), col_names = c("VAR1", "VAR2", "VAR3") ) nis_data <- read_fwf("本地路径/nispuf14.dat", col_pos) - 导出为易用格式:
# 导出为CSV write_csv(nis_data, "nispuf14_clean.csv") # 或高效的Parquet格式(需arrow包) library(arrow) write_parquet(nis_data, "nispuf14_clean.parquet")
方案3:Python pandas替代方案
熟悉Python的话,用pandas处理固定宽度文件更稳定:
- 解析SAS文件获取字段的起始/结束位置和变量名,然后读取:
import pandas as pd # 示例:替换为实际从SAS文件提取的字段信息 colspecs = [(0, 2), (2, 5), (5, 10)] col_names = ["VAR1", "VAR2", "VAR3"] nis_data = pd.read_fwf("本地路径/nispuf14.dat", colspecs=colspecs, names=col_names) - 导出为常用格式:
nis_data.to_csv("nispuf14_clean.csv", index=False) nis_data.to_parquet("nispuf14_clean.parquet")
最优格式建议
转换后优先保存为Parquet格式,它比CSV占用空间更小、读写速度更快,还能保留数据类型信息,适合长期研究使用。
内容的提问来源于stack exchange,提问作者Nhu Nguyen
相关产品推荐
相关产品推荐

