R 是否可以在不打开CSV文件的情况下获取CSV文件中的行数?

R 是否可以在不打开CSV文件的情况下获取CSV文件中的行数?,r,excel,csv,R,Excel,Csv,我有一个大小为1 GB的CSV文件,由于我的笔记本电脑是基本配置,我无法在Excel或R中打开该文件。但出于好奇,我想获取文件中的行数。如果我能做到,我该怎么做?对于Linux/Unix: wc -l filename 对于Windows: find /c /v "A String that is extremely unlikely to occur" filename 选项1: 通过文件连接,count.fields()根据一些sep值(我们这里不关心)计算文件每行的字段数。因此,如果我

我有一个大小为1 GB的CSV文件,由于我的笔记本电脑是基本配置,我无法在Excel或R中打开该文件。但出于好奇,我想获取文件中的行数。如果我能做到,我该怎么做?

对于Linux/Unix:

wc -l filename
对于Windows:

find /c /v "A String that is extremely unlikely to occur" filename

选项1:

通过文件连接,
count.fields()
根据一些
sep
值(我们这里不关心)计算文件每行的字段数。因此,如果我们计算结果的长度,理论上我们应该得到文件中的行数

length(count.fields(filename))
如果有标题行,可以使用
skip=1

length(count.fields(filename, skip = 1))
您还可以根据自己的具体需要调整其他参数,例如跳过空行

args(count.fields)
# function (file, sep = "", quote = "\"'", skip = 0, blank.lines.skip = TRUE, 
#     comment.char = "#") 
# NULL
有关更多信息,请参阅
帮助(count.fields)

就速度而言还不错。我在一个包含99846行的棒球文件上测试了它

nrow(data.table::fread("Batting.csv"))
# [1] 99846

system.time({ l <- length(count.fields("Batting.csv", skip = 1)) })
#   user  system elapsed 
#  0.528   0.000   0.503 

l
# [1] 99846
file.info("Batting.csv")$size
# [1] 6153740

下面是我用过的东西:

testcon <- file("xyzfile.csv",open="r")
readsizeof <- 20000
nooflines <- 0
( while((linesread <- length(readLines(testcon,readsizeof))) > 0 ) 
nooflines <- nooflines+linesread )
close(testcon)
nooflines

testcon根据前1000行的大小估计行数

size1000  <- sum(nchar(readLines(con = "dgrp2.tgeno", n = 1000)))

sizetotal <- file.size("dgrp2.tgeno")
1000 *  sizetotal / size1000

size1000可能只是从命令行提示符下执行
wc-l yourfile.csv
之类的操作?如果文件大小为1 GB,您应该能够导入它。当然,您不应该对
read.table
和朋友这样做。使用package data.table中的
fread
。那么您是说
nrow(read.csv(“file.csv”,header=T/F))
R?是的,
fread
当然可以prefered@Alex不要对1GB文件使用
read.csv
。速度很慢。如果所有方法都崩溃,您可以使用csv拆分器将大文件拆分为块。。虽然不优雅,但可能有效,选择2更好。关于“Windows”解决方案,请注意:(1)这是从
cmd.exe
运行的;(2)
filename
包含文件的完整路径(&将斜杠转过来);(3) 如果有一个标题,则该“行”被计数,即,一个标题+10行的文件将返回
11
。(所有这些都不会影响答案的质量。)
size1000  <- sum(nchar(readLines(con = "dgrp2.tgeno", n = 1000)))

sizetotal <- file.size("dgrp2.tgeno")
1000 *  sizetotal / size1000