read_fwf与vroom_fwf导入本地固定宽文件丢失首行问题
本地固定宽度文件用read_fwf/vroom_fwf读取时首行丢失的问题解决
问题现象
在R语言中使用read_fwf(readr包)和vroom_fwf(vroom包)读取本地固定宽度文件时出现首行丢失异常:
- 本地文件
vroom_fwf_test.txt实际包含2行数据,导入后仅得到1行结果 - 若文件仅存1行数据,导入结果为0行
但通过远程链接读取相同内容的文件时,读取结果完全正常,推测问题根源是本地文件的换行符格式与函数默认解析规则不兼容。
排查与解决方法
1. 确认文件换行符类型
用文本编辑器(如Notepad++)打开本地文件,查看换行符格式:Windows系统默认是CRLF(\r\n),Unix/Linux系统是LF(\n)。也可以在R中执行以下代码查看行读取情况:
readLines("vroom_fwf_test.txt")
如果输出结果把多行内容合并成一行,说明换行符解析异常。
2. 读取时手动指定换行符
针对不同的换行符格式,在读取时通过locale参数明确指定:
- 若文件是Windows换行符(CRLF):
# 使用vroom_fwf library(vroom) vroom_fwf("vroom_fwf_test.txt", fwf_widths(c(5, 5)), # 根据实际列宽度调整 locale = locale(newline = "\r\n")) # 使用read_fwf library(readr) read_fwf("vroom_fwf_test.txt", fwf_widths(c(5, 5)), locale = locale(newline = "\r\n")) - 若文件是Unix换行符(LF),可指定
newline = "\n",或直接使用默认设置(多数情况下默认支持LF)。
3. 转换文件换行符格式
将本地文件的换行符统一转换为Unix格式(LF)后再读取,可通过R代码完成转换:
# 读取原文件所有行 lines <- readLines("vroom_fwf_test.txt", warn = FALSE) # 以Unix换行符写入新文件 writeLines(lines, "vroom_fwf_test_converted.txt", sep = "\n") # 读取转换后的文件 vroom_fwf("vroom_fwf_test_converted.txt", fwf_widths(c(5, 5)))
后续跟进
该问题已在vroom官方仓库提交Issue,等待官方修复该兼容性问题。
内容的提问来源于stack exchange,提问作者Kim
相关产品推荐
相关产品推荐

