R语言data.table fread读取CSV最后N行方法(iris示例)
使用data.table::fread读取CSV文件最后N行的方法
报错原因
你遇到的乱码+空表问题核心原因是*tail是Linux、macOS类Unix系统的内置Shell命令,Windows系统默认不自带该命令*,调用时系统找不到可执行程序直接执行失败,返回空内容给fread,最终得到0行0列的结果,乱码是系统错误提示和R终端编码不匹配导致的。
可用方案
- 跨平台通用方案(最推荐,无外部依赖)
不需要调用任何系统外部命令,仅用fread自带参数即可实现,全系统兼容,不会出现路径、斜杠、命令不存在的兼容问题:
以你导出的iris.csv为例,运行后得到的就是文件最后10行数据,和read.csv读全量后取尾行的结果完全一致。library(data.table) fpath <- "C:/Users/TARAS/Desktop/iris.csv" # 快速统计文件总行数,内存占用极低 total_lines <- length(count.fields(fpath)) # 自定义要读取的最后N行数量 n_last <- 10 # 跳过前序行,fread会自动识别保留表头 last_n_rows <- fread(fpath, skip = total_lines - n_last) - Windows系统命令行方案
如果习惯用cmd参数调用系统命令,Windows可以直接用PowerShell自带的内容读取命令实现tail效果,不需要额外安装软件:
如果你安装了Git Bash、Rtools或者Cygwin,把对应工具的bin目录加入系统环境变量后,也可以直接用fpath <- "C:/Users/TARAS/Desktop/iris.csv" n_last <- 10 last_n_rows <- fread(cmd = paste0('powershell -Command "Get-Content -Path \"', fpath, '\" -Tail ', n_last, '"'))tail命令写法。 - Linux/macOS系统方案
类Unix系统原生自带tail命令,直接调用即可,路径包含空格时用单引号包裹路径避免解析错误:fpath <- "/home/xxx/Desktop/iris.csv" n_last <- 10 last_n_rows <- fread(cmd = paste0("tail -", n_last, " '", fpath, "'"))
注意:如果CSV文件包含引号包裹的换行字段,不要用系统命令取行的方式,命令会把字段内的换行识别为行分隔符导致读取出错,这种场景优先用第一种跨平台原生方案。
内容的提问来源于stack exchange,提问作者mr.T
相关产品推荐
相关产品推荐

