跳过read.csv中所有前导空行

时间:2014-10-20 00:07:54

标签: r import read.csv

我希望将csv文件导入R,第一个非空行提供数据框列的名称。我知道您可以提供skip = 0参数来指定首先读取哪一行。但是,第一个非空行的行号可以在文件之间更改。

如何确定有多少行为空,并为每个文件动态跳过它们?

正如评论中指出的那样,我需要澄清一下"空白"手段。我的csv文件看起来像:

,,,
w,x,y,z
a,b,5,c
a,b,5,c
a,b,5,c
a,b,4,c
a,b,4,c
a,b,4,c

这意味着一开始就有一些逗号行。

3 个答案:

答案 0 :(得分:7)

read.csv会自动跳过空白行(除非您设置blank.lines.skip=FALSE)。见?read.csv

在写完上述内容之后,海报解释说空白行实际上并不是空白,但在其中有逗号,但逗号之间没有任何内容。在那种情况下,使用data.table包中的fread来处理它。 skip=参数可以设置为标题中的任何字符串:

library(data.table)
DT <- fread("myfile.csv", skip = "w") # assuming w is in the header
DF <- as.data.frame(DT)

如果data.table可以作为返回值,则可以省略最后一行。

答案 1 :(得分:2)

根据您的文件大小,这可能不是最佳解决方案,但可以胜任。

这里的策略是,不是用分隔符读取文件,而是读为行, 并计算字符并存储到temp中。 然后,while循环将在列表中搜索第一个非零字符长度, 然后将读取该文件,并存储为data_filename。

flist = list.files()
for (onefile in flist) {
  temp = nchar(readLines(onefile))
  i = 1
  while (temp[i] == 0) {
    i = i + 1
  }
  temp = read.table(onefile, sep = ",", skip = (i-1))
  assign(paste0(data, onefile), temp)
}

如果文件包含标题,则可以从2开始。

答案 2 :(得分:2)

如果前几行空行真的为空,那么read.csv应自动跳到第一行。如果他们有逗号但没有值,那么您可以使用:

df = read.csv(file = 'd.csv')
df = read.csv(file = 'd.csv',skip = as.numeric(rownames(df[which(df[,1]!=''),])[1]))

如果你有大文件(因为你必须导入两次),它效率不高,但它有效。

如果要导入带有相同问题的制表符分隔文件(变量空白行),请使用:

df = read.table(file = 'd.txt',sep='\t')
df = read.table(file = 'd.txt',skip = as.numeric(rownames(df[which(df[,1]!=''),])[1]))