使用vroom读取多CSV文件报错,疑因版本更新,求解决方案
使用vroom读取多CSV文件时的字符串处理错误解决
问题背景
- 运行环境:RStudio 4.3.1(64位)
- 异常情况:9个月前可正常运行的多CSV读取代码报错,推测为vroom包或RStudio更新引发
- 数据限制:无法提供示例(隐私保护的大型注册表数据)
原代码
library(vroom) library(fs) lmdb_files<-dir_ls(glob="*.csv") lmdb_files lmdb2005.csv lmdb1995.csv lmdb1997.csv lmdb1998.csv lmdb1999.csv lmdb2000.csv lmdb2001.csv lmdb2002.csv lmdb2003.csv lmdb2004.csv lmdb2006.csv lmdb2007.csv lmdb2008.csv lmdb2009.csv lmdb2010.csv lmdb2011.csv lmdb2012.csv lmdb2013.csv lmdb2014.csv lmdb2015.csv lmdb2016.csv lmdb2017.csv lmdb2018.csv lmdb2019.csv lmdb2020.csv lmdb<-vroom(lmdb_files)
翻译后的错误与警告信息
错误:
在gsub("\"[^\"]*\"", "", lines)中:输入字符串15无效附加警告:
在gsub("\"[^\"]*\"", "", lines)中:
遇到宽字符串内容"000001111111","EI",3/5/1997,1,,"00","Visk<f8>se ""DAK""","0,5%","S01",1,"PK","pakninger","BO",0.5,"PC",5
可行解决方法
- 指定文件编码:从警告里的
<f8>(对应挪威语字符ø)判断,文件编码大概率是ISO-8859-1或Windows-1252,vroom更新后默认编码可能变更,手动指定编码试试:lmdb <- vroom(lmdb_files, locale = locale(encoding = "ISO-8859-1")) # 若无效,替换为Windows-1252编码 # lmdb <- vroom(lmdb_files, locale = locale(encoding = "Windows-1252")) - 定位并跳过错误行:先逐个读取文件排查出出错的文件,再跳过对应错误行:
# 遍历文件排查错误源 for (file in lmdb_files) { tryCatch({ temp <- vroom(file) cat(file, "读取成功\n") }, error = function(e) { cat(file, "读取失败:", e$message, "\n") }) } # 找到出错文件后,跳过第15行(skip参数为要跳过的行数,第15行则skip=14) lmdb <- vroom("出错文件名.csv", skip = 14) - 降级vroom包:如果确认是包更新导致的兼容性问题,回退到之前可用的版本:
# 卸载当前版本 remove.packages("vroom") # 安装旧版本(示例为0.6.4,需替换为你9个月前使用的版本号) install.packages("https://cran.r-project.org/src/contrib/Archive/vroom/vroom_0.6.4.tar.gz", repos = NULL, type = "source") - 明确指定引号规则:警告中的
""DAK""是CSV的转义双引号格式,手动指定quote参数确保解析正确:lmdb <- vroom(lmdb_files, quote = "\"")
内容的提问来源于stack exchange,提问作者Hong
相关产品推荐
相关产品推荐

