如何在R中不加载数据直接统计大型CSV文件的行数?
绝对有!处理超大CSV的时候,把整个文件加载进R确实太耗时间了,下面给你几个不用读全量数据就能快速统计记录数的方法:
方法一:直接用系统命令(最快首选)
系统级命令是处理大文件的最优解,完全不用碰R,速度快到飞起:
- Linux/macOS 终端:
统计总行数(包含表头):
如果要排除表头,直接计算真实记录数:wc -l your_file.csvwc -l your_file.csv | awk '{print $1 - 1}' - Windows 环境:
用命令提示符统计总行数:
排除表头的话,用PowerShell更方便:find /c /v "" your_file.csv(Get-Content your_file.csv | Measure-Object -Line).Lines - 1
方法二:在R环境内快速统计(不用离开R)
如果不想切换到终端,R里也有不用加载全量数据的方法:
- 用
readLines计数:
这个函数只会读取文件的行数,不解析任何数据,速度远快于read.csv:# 总行数减1(排除表头) record_count <- length(readLines("your_file.csv")) - 1 - 用
vroom包(专为大文件优化):vroom是处理大CSV的神器,它的vroom_lines函数可以高效读取行数:library(vroom) record_count <- length(vroom_lines("your_file.csv")) - 1 - 调用系统命令到R里:
也可以在R里直接调用前面的系统命令,不用切换环境:# Linux/macOS 下 record_count <- as.integer(system("wc -l your_file.csv | awk '{print $1 - 1}'", intern = TRUE)) # Windows PowerShell 下 record_count <- as.integer(system('powershell "(Get-Content your_file.csv | Measure-Object -Line).Lines - 1"', intern = TRUE))
小提示:如果你的CSV里有换行符(比如某个字段里包含\n),wc -l或者readLines可能会统计错误,这种情况下可以用data.table的fread,它能正确解析带换行符的CSV,而且可以只计数不加载全量:
library(data.table) # fread会自动识别表头,直接返回记录数 record_count <- nrow(fread("your_file.csv", select = 1)) # 只读取第一列,减少内存占用
内容的提问来源于stack exchange,提问作者hawkaterrier




