data.table fread如何忽略空行

8

看起来,如果文件的第二行为空,则不会读取列名。我已经根据文档尝试了一些开关,例如header、skip,但无法使其工作。

如果我的文件的第二行为空,如何忽略这个事实并仍然将第一行读取为列名?

第二行是空的:

> fread('c1 c2\n\n1 2\n3 4\n')

   V1 V2
1:  1  2
2:  3  4

第二行不是空的:

> fread('c1 c2\n1 2\n3 4\n')
   c1 c2
1:  1  2
2:  3  4

@VasilyA会重新打开您的问题,但我认为这并不是一个明显的重复,因为您接受的答案比下面的答案要年轻。 - Jaap
1
@VasilyA 如果你同意应该关闭它,最好就让它保持不变。在SO上有太多未标记为重复的副本,与其完全不链接,还不如以某种方式进行链接...就像这种情况发生了两年一样。如果追究关闭重复问题的人,你会进一步减少这些链接的制作动力。无论如何,值得考虑。 - Frank
我完全同意标记重复问题是必要且有用的工作,我不想打击它的积极性,如果看起来是这样,对不起。我只是不是 Stack Overflow 规则和传统方面的专家,所以我问了一下为什么要选择两者之一的逻辑。感谢您的时间,也为造成不必要的洪水道歉。 - Vasily A
2个回答

12

当前版本的data.table(1.9.8+)添加了一个blank.lines.skip参数,似乎可以解决这个问题:

fread('c1 c2\n\n1 2\n3 4\n',blank.lines.skip = TRUE)
#    c1 c2
# 1:  1  2
# 2:  3  4

2
一个解决方法:使用fread读取文件,然后使用其他工具正确地读取第一行并将其添加为列名。
library(data.table)
library(readr)

str_data <- 'c1 c2\n\n1 2\n3 4\n'
dt <- fread(str_data)

df.header <- read_delim(str_data, delim = " ", n_max = 0)
setnames(dt, names(df.header))

> dt
   c1 c2
1:  1  2
2:  3  4

2
@Jim Green请考虑接受其中一个答案,如果它们解决了您的问题。 - paljenczy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接