检索fread使用的列分隔符

4

fread 函数来自于 data.table 包,通常可以在读取文件时自动确定列分隔符 (sep)。

例如,在这里,fread 自动检测到 | 作为列分隔符:

library(data.table)
fread(paste(c("A|1", "B|2", "C|3"), collapse = "\n"))
#    V1 V2
# 1:  A  1
# 2:  B  2
# 3:  C  3

但是我该如何检索出最终由fread使用的列分隔符(此处为|)?


3
你有检查过fread中的verbose参数吗?例如:fread(paste(c("A|1", "B|2", "C|3"), collapse = "\n"), verbose = TRUE),会显示出"Detecting sep ... '|'"。你可以考虑让你的问题更具体一些,因为你目前有相当多不同(且广泛)的问题。同时,请提供一个“最小化”的示例。祝好! - Henrik
是的,这实际上是我的主要问题,知道这个就可以否定其他的了。而且,我认为这只是一些属性的简单问题,所以我没有包含一个例子。谢谢!如果你想把你的回答变成答案,我会接受它。 - Pablo Boswell
1
你应该始终尝试包含一个 MCVE。一般来说,当人们拥有玩具数据并且可以验证他们的代码时,这会使得他们更愿意提供帮助。 - Henrik
是的,我通常会这样做来回答更复杂的问题。谢谢! - Pablo Boswell
1个回答

2

正如Henrik所提到的,如果选择verbose = TRUE,这些信息将被打印到控制台。您可以使用以下方法捕获有关分隔符打印的信息:

library(magrittr)
example <- paste(c("A|1", "B|2", "C|3"), collapse = "\n")
capture.output(fread(example, verbose = TRUE) %>% {NULL}) %>% 
    .[grepl('Detecting sep', .)]


#[1] "Detecting sep ... '|'"

你也可以基于 fread 查找分隔符的描述实现自己的分隔符查找器:

默认使用集合 [,\t |;:] 中在引号 ("") 区域之外,位于第 autostart 行的第一个字符作为分隔符


1
不错的答案。我尝试了一下,没有使用 %>% {NULL},似乎仍然可以工作..?OP/用户还可以添加一步 %>% sub("^.* '(.)'$", "\\1", x = .) 来提取字符。 - Frank
1
@Frank 如果没有 %>% {NULL},整个 data.table 将被放入 capture.output(...) 的输出中。 - IceCreamToucan
1
噢,对了,谢谢。实际上,我想你不仅需要分隔符,还需要数据,所以 capture.output(dat <- fread(example, verbose = TRUE)) %>% ...,除非我还漏掉了什么。 - Frank
是的,那可能是更好的方式。 - IceCreamToucan

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