【问题标题】:R data.table: using fread on all .csv files in folder skipping the last line of eachR data.table:对文件夹中的所有 .csv 文件使用 fread,跳过每个文件的最后一行
【发布时间】:2016-08-02 04:33:57
【问题描述】:

我有数百个 .csv 文件需要使用 fread 读取并保存为一个数据表。每个 .csv 的基本结构都相同。有需要跳过的标题信息(很容易使用 skip = )。我很难跳过每个 .csv 文件的最后一行。每个 .csv 文件都有不同的行数。

如果我在 Test 文件夹中只有一个文件,此脚本会完美跳过第一行(使用 skip = )和最后一行(使用 nrows = ):

file <- list.files("Q:/Test/", full.names=TRUE)
all <- fread(file, skip = 7, select = c(1:7,9),
             nrows = length(readLines(file))-9)

在Test文件夹中保存多个文件时,这是我尝试的代码:

file <- list.files("Q:/Test/", full.names=TRUE)
L <- lapply(file, fread, skip = 7, select = c(1:7,9),
        nrows = length(readLines(file))-9)
dt <- rbindlist(L)

它不会创建 L 并给我这个错误:

Error in file(con, "r") : invalid 'description' argument

当每个 .csv 的行数不同时,如何跳过每个 .csv 的最后一行?

我正在使用 data.table 版本 1.9.6。谢谢。

【问题讨论】:

  • 不要使用readLines,那样会浪费很多精力。试试这里的方法:stackoverflow.com/questions/3137094/…
  • 也许nrow 可以使用负值来跳过文件底部的行。归档#1643
  • 也许head -n-1 直接传递给fread。或 grep -v 删除尾随页脚文本。请参阅this new page 的第 1 部分。
  • this answer 也可能有帮助。
  • @MichaelChirico 我喜欢这种方法,并正在努力解决它。我在 Windows 7 上使用 Rstudio,所以我相信我需要使用 Cygwin。到目前为止,我还不能让它工作。

标签: r data.table


【解决方案1】:

这有点晚了,但是这对我有用:

library(data.table)

fnames <- dir("path", pattern = "csv")

read_data <- function(z){
  dat <- fread(z, skip = 1, select = 1)
  return(dat[1:(nrow(dat)-1),])
}

datalist <- lapply(fnames, read_data)

bigdata <- rbindlist(datalist, use.names = TRUE)

这里的path 指的是您正在查看的目录。我假设所有读取文件的名称都相似,如果不是,您始终可以使用namesbigdata 定义一个新名称。希望这可以帮助!

【讨论】:

    猜你喜欢
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多