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

问题描述 投票:4回答:1

我试图使用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。

r csv data.table fread
1个回答
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:“......”允许匹配多个单词,包括空格或单个单词。

© www.soinside.com 2019 - 2024. All rights reserved.