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

Ohh*_*ash 22 csv excel r

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

Ton*_*uth 34

对于Linux/Unix:

wc -l filename
Run Code Online (Sandbox Code Playgroud)

对于Windows:

find /c /v "A String that is extremely unlikely to occur" filename
Run Code Online (Sandbox Code Playgroud)

  • 这不计算 CSV 中的行数,而是计算文件行数,这是不同的。如果同一行中有换行符,它们将单独计算。 (2认同)

Ric*_*ven 22

选项1:

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

length(count.fields(filename))
Run Code Online (Sandbox Code Playgroud)

如果您有标题行,则可以跳过它 skip = 1

length(count.fields(filename, skip = 1))
Run Code Online (Sandbox Code Playgroud)

还有其他参数可以根据您的特定需求进行调整,例如跳过空白行.

args(count.fields)
# function (file, sep = "", quote = "\"'", skip = 0, blank.lines.skip = TRUE, 
#     comment.char = "#") 
# NULL
Run Code Online (Sandbox Code Playgroud)

了解help(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
Run Code Online (Sandbox Code Playgroud)

(效率更高)选项2: 另一个想法是data.table::fread()仅使用读取第一列,然后获取行数.这将非常快.

system.time(nrow(fread("Batting.csv", select = 1L)))
#   user  system elapsed 
#  0.063   0.000   0.063 
Run Code Online (Sandbox Code Playgroud)

  • #选项2更好。data.table 获胜。 (2认同)

pal*_*sen 5

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

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

sizetotal <- file.size("dgrp2.tgeno")
1000 *  sizetotal / size1000
Run Code Online (Sandbox Code Playgroud)

这对于大多数用途来说通常已经足够了 - 对于大文件来说速度要快得多。