【问题标题】:How can I count the lines of multiple csv that are in one folder?如何计算一个文件夹中多个 csv 的行数?
【发布时间】:2019-12-29 17:56:23
【问题描述】:

我在一个文件夹中有 500 多个“.csv”文件。我想计算每个文件中的总行数,因为我想确认我所做的所有文件的合并是否正确。

我尝试使用 length(count/fields) 但我想创建一个循环以避免一一进行。我是 R 新手,所以我的编程技能非常基础。有没有办法可以使用带有 files=dir("path") 的代码?

length(count.fields(files, skip = 1))

【问题讨论】:

  • 您使用的是 Mac/Linux 吗?只需在命令行上使用wc -l /path/to/for/*
  • 您也可以使用system 函数从R 控制台传递它。

标签: r csv count data.table


【解决方案1】:

使用base R,以下应该可以工作(来自FG7的fread对于大文件的回复比read.csv快,但如果很多情况read.csv会很好):

files<-list.files(your.folder, full.names=TRUE)
file.lengths<-unlist(lapply(file, function(x) nrow(read.csv(files)))#number of rows per file
sum(file.lengths)#total number of rows in all files

【讨论】:

    【解决方案2】:

    使用count.fields 的优点是它不会将文件加载到内存中。 因此,它应该比使用read.csv 或其他函数更快。

    获取文件列表:

     files <- list.files(path, full.names=TRUE)
    

    获取每个文件的行数:

    lapply(X = files, FUN = function(x) {
      length(count.fields(x, skip = 1))
     })
    

    基准测试

    library(rbenchmark)
    
    benchmark("count.fields" = {
      lapply(X = files, FUN = function(x) {
        length(count.fields(x, skip = 1))
      })
    },
    "read.csv" = {
      lapply(X = files, FUN = function(x) {
        nrow(read.csv(x, skip = 1))
      })
    },
    "fread" = {
      lapply(X = files, FUN = function(x) {
        nrow(data.table::fread(x, skip = 1))
      })
    },
    replications = 1000,
    columns = c("test", "replications", "elapsed",
                "relative", "user.self", "sys.self"))
    
    
              test replications elapsed relative user.self sys.self
    1 count.fields         1000    0.81    1.000      0.28     0.50
    3        fread         1000    6.24    7.704      4.57     1.66
    2     read.csv         1000    2.93    3.617      2.16     0.76
    

    【讨论】:

      猜你喜欢
      • 2017-09-05
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 2015-08-27
      • 2018-05-29
      相关资源
      最近更新 更多