为什么使用read_fwf()读取文件的效果和《R Cookbook第二版》描述不一致?
报错原因
这个报错是readr包版本迭代导致的接口不兼容问题:
- 《R Cookbook 第二版》编写时采用的是1.x版本的
readr包,该版本下fwf_empty()函数支持直接传入文件路径作为参数,返回的列宽规则可直接传递给read_fwf()使用 - 2.0及以上版本的
readr包中,fwf_empty()会自动将传入的文件路径转换为临时连接对象用于列宽检测,该连接对象传递给read_fwf()时会触发「filemust be a regular file, not a connection」的校验报错
解决方法
推荐两种稳定的解决方案,无需降级包:
方案1:手动指定列宽(兼容性最好)
你使用的示例文件列宽固定,直接手动指定每列宽度即可,完全规避自动检测的兼容问题:
library(readr) # 依次指定last、first、birth、death四列的宽度 col_rule <- fwf_widths(c(10, 10, 4, 4), col_names = c("last", "first", "birth", "death")) t1 <- read_fwf("fixed-width.fwf", col_rule) t2 <- read_fwf("fixed-width.txt", col_rule)
方案2:先读取文件内容再检测列宽
如果需要保留自动检测列宽的功能,可以先把文件内容读为字符串向量,再传入fwf_empty():
library(readr) # 读取f1文件的所有行内容 f1_lines <- readLines("fixed-width.fwf") # 基于内容检测列宽 col_rule <- fwf_empty(f1_lines, col_names = c("last", "first", "birth", "death")) # 读取数据 t1 <- read_fwf(f1_lines, col_rule) # 同理处理txt文件 f2_lines <- readLines("fixed-width.txt") col_rule2 <- fwf_empty(f2_lines, col_names = c("last", "first", "birth", "death")) t2 <- read_fwf(f2_lines, col_rule2)
内容的提问来源于stack exchange,提问作者Everyday Struggle
相关产品推荐
相关产品推荐

