2016-04-11 148 views
1

我有数百个.csv文件需要使用fread读入并保存为一个数据表。每个.csv的基本结构都是一样的。有需要跳过的标题信息(使用skip =很容易)。我很难跳过每个.csv文件的最后一行。每个.csv文件都有不同数量的行。R data.table:在文件夹中的所有.csv文件上使用fread跳过每个文件的最后一行

如果我在测试文件夹中只有一个文件,这个脚本完全跳过第一行(使用跳跃=)和最后一行(使用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。谢谢。

+3

不要使用'readLines',这会浪费很多精力。试试这里的方法:http://stackoverflow.com/questions/3137094/how-to-count-lines-in-a-document – MichaelChirico

+3

也许'nrow'可以使用负值来跳过文件底部的行。提交[#1643](https://github.com/Rdatatable/data.table/issues/1643)。 – Arun

+4

也许'head -n-1'直接传递给'fread'。或者'grep -v'来删除尾部页脚文本。参见[这个新页面]的第1部分(https://github.com/Rdatatable/data.table/wiki/Convenience-features-of-fread)。 –

回答

1

这是一个有点晚了,但在这里是为我工作:

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定义一个新名称。希望这可以帮助!

相关问题