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

循环读取.dbc转.csv时出现dbc2dbf解压错误-1的问题咨询

解决R语言批量转换.dbc文件到.csv时的解压错误(-1)

错误原因

出现Error in dbc2dbf(file, out) : error decompressing file: -1错误,通常由以下几种情况导致:

  • 文件损坏:.dbc文件在下载、传输或存储过程中损坏,无法正常解压
  • 路径问题:文件路径包含空格、括号等特殊字符,导致read.dbc函数无法正确定位或读取文件
  • 格式不兼容:当前使用的read.dbc包不支持该.dbc文件的压缩格式
  • 权限不足:R进程没有读取源.dbc文件或写入CSV文件的权限

解决方法

针对上述原因,可逐一排查并尝试以下方案:

1. 验证文件完整性

单独选取报错的.dbc文件,用第三方工具(如DBF Viewer)尝试打开,确认文件是否损坏。若损坏,重新下载或获取完整的源文件。

2. 修复路径处理

  • 避免手动拼接路径,改用R内置的file.path()函数,它会自动适配Windows系统的路径分隔符,同时减少特殊字符导致的错误
  • 建议将文件移动到无特殊字符的目录下(比如把arquivo (1)重命名为arquivo1),避免路径中的括号、空格干扰

3. 加入错误捕获定位问题

在循环中添加tryCatch,可以快速定位是哪个文件报错,避免整个循环中断,同时输出详细错误信息。

4. 检查权限

右键以管理员身份运行R/RStudio,确保程序有读取源文件和写入CSV的权限。

5. 尝试替代方案

如果read.dbc包始终无法处理文件,可以尝试:

  • 先用Python的dbc库(如pip install dbc)批量转换.dbc为.dbf,再用R的read.dbf读取
  • 使用命令行工具(如dbc2dbf)先转换格式,再进行后续处理

优化后的代码示例

nomes  <- c(
  "DNAC2013.dbc", "DNAC2014.dbc", "DNAC2015.dbc", "DNAC2016.dbc", "DNAC2017.dbc", "DNAC2018.dbc", "DNAC2019.dbc", "DNAC2020.dbc", "DNAC2021.dbc",
  "DNAL2013.dbc", "DNAL2014.dbc", "DNAL2015.dbc", "DNAL2016.dbc", "DNAL2017.dbc", "DNAL2018.dbc", "DNAL2019.dbc", "DNAL2020.dbc", "DNAL2021.dbc",
  "DNAM2013.dbc", "DNAM2014.dbc", "DNAM2015.dbc", "DNAM2016.dbc", "DNAM2017.dbc", "DNAM2018.dbc", "DNAM2019.dbc", "DNAM2020.dbc", "DNAM2021.dbc",
  "DNAP2013.dbc", "DNAP2014.dbc", "DNAP2015.dbc", "DNAP2016.dbc", "DNAP2017.dbc", "DNAP2018.dbc", "DNAP2019.dbc", "DNAP2020.dbc", "DNAP2021.dbc"
  # 补充其他文件名
)

# 建议修改为无特殊字符的路径,例如:
# diretorio <- "C:/Users/dossa/Downloads/vivos/"
diretorio <- "C:/Users/dossa/Downloads/arquivo (1)/vivos/"

for (nome in nomes) {
  caminho <- file.path(diretorio, nome)
  
  # 先检查文件是否存在
  if (!file.exists(caminho)) {
    message(paste("跳过不存在的文件:", caminho))
    next
  }
  
  tryCatch({
    # 读取.dbc文件
    x <- read.dbc(caminho)
    
    # 生成CSV文件名,忽略大小写匹配.dbc后缀
    nome_csv <- gsub("\\.dbc$", ".csv", nome, ignore.case = TRUE)
    caminho_csv <- file.path(diretorio, nome_csv)
    
    # 保存为CSV,关闭行索引避免冗余
    write.csv(x, file = caminho_csv, row.names = FALSE)
    message(paste("转换完成:", nome))
  }, error = function(e) {
    message(paste("转换失败", nome, ":", e$message))
  })
}

内容的提问来源于stack exchange,提问作者Renan Saraiva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:20:05