如何读取R中的多个csv文件并使用fread函数跳过最后一行

时间:2017-12-27 17:43:26

标签: r csv data.table fread

我正在尝试使用fread函数读取多个文件(csv)。但是在最后一行我有不必要的数据,我无法使用fread,因为它会抛出错误。

代码:

library(data.table)    
fnames <- list.files("Path",pattern = "^.*Star.*.csv$",full=TRUE)

   read_data <- function(z){
      dat <- fread(z, verbose = TRUE, nrow= -1)
   }

   datalist <- lapply(fnames, fread)

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

错误:

换行期间出错:预期的sep(',')但新行,EOF(或其他非打印字符)在从第10点检测类型时结束字段4:2704,IE,N,ENDOFFILEMARKER,5397786

我在每个文件的最后都有一行数据ENDOFFILEMARKER。

注意:

  • 我需要使用fread,因为每个数据文件大约为700 MB。

1 个答案:

答案 0 :(得分:2)

如果没有看到您的csv文件,很难确定最佳答案。也许首先尝试使用fread读取一个文件。使用这样的东西可能会起作用:

dat <- fread("grep -v ENDOFFILEMARKER filename.csv")

其中filename.csv是放置在工作目录中的某个文件的名称。 -v使grep返回除包含字符串ENDOFFILEMARKER的行之外的所有行。如果您可以使用一个文件,那么您可以使用lapply将相似的逻辑应用于所有文件。

另一个对我有用的选择是使用readLines函数。缺点是readLines函数有点慢。但是,如果你无法找到另一种方法,那么readLines将起作用。这基本上就是我在一个文件中使用它的方式:

length_a <- length(readLines("filename.csv"))
dt <- fread("filename.csv", nrows = length_a-1)

一旦你让它为一个文件工作,你就可以弄清楚如何将它用于所有文件的循环。

我理解fread("head -n -1 filename.csv")是跳过最后一行的普遍接受的方法,但我从来没有能够让它正常工作。

修改:如果您使用的是Windows,这可能对您有用:

 dat <- fread('findstr /V /C:"ENDOFFILEMARKER" filename.csv')
如果您使用Linux或在Windows计算机上安装了Linux工具,那么grep可以正常工作。如果您使用的是Windows,findstr命令与Linux中的grep命令类似。 / V返回除包含ENDOFFILEMARKER的行之外的所有行。 / C:&#34; ......&#34;允许匹配多个单词,包括空格或恰好只有一个单词。