我正在尝试使用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。
注意:
答案 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;允许匹配多个单词,包括空格或恰好只有一个单词。