You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:30:17