使用 readr 读取文本文件,其中引号结束行

Posted

技术标签:

【中文标题】使用 readr 读取文本文件,其中引号结束行【英文标题】:Read a text file with readr where a quote ends rows 【发布时间】:2018-05-07 15:47:59 【问题描述】:

我有一个看起来像这样的文本文件:

a,b,c,d
"string1","string2","string3","
"string4","string5","string6","

文件本身以逗号分隔,但每一行都以双引号结尾(即,不是逗号分隔符)。 readr::read_delim() 不理解行尾,因此尝试将所有数据读入一行。

data.table::fread() 按预期导入,但我想找到readr 解决方案(如果存在)。

【问题讨论】:

【参考方案1】:

在这种情况下,使用fread 似乎是迄今为止最简单的选择。如果不希望fread 返回data.table,可以使用fread 中的data.table = FALSE 参数。

一个例子:

fread("C:/data.txt", data.table = FALSE)

【讨论】:

我并不反对 data.table,但很好奇我是否遗漏了 readr 包文档中的一些明显内容。在data.table 中自动检测到行尾,而readr 似乎不是这种情况。 @Chris 据我所知(而且我已经广泛查看)您没有错过readr 文档中的任何内容。我猜readr 的功能不如fread 灵活,后者有其优点和缺点(如本例所示)。【参考方案2】:

这是一个冗长的方法,但肯定有一个更简洁的解决方案:

readr::read_lines("C:/data.txt", skip = 1) %>% 
  tibble::as_tibble() %>% 
  tidyr::separate(value, into = c("a", "b", "c", "d"), sep = ",") %>% 
  mutate_at(.vars = vars(a:c), 
            .funs = stringr::str_replace_all, 
            pattern = "\"", 
            replacement = "")

【讨论】:

有很多代码要避免使用fread。如果您因为fread 返回data.table 而不想使用它,请参阅我的答案以获得解决方案。 如果我的数据包含分隔符或其他“保留”字符,我已从 read.csv 移至 readXL 以避免在导入过程中指定错误。或许考虑使用不同的数据存储选项? 我同意这是很多代码。使用data.table 可以工作并且更加简洁,但希望我错过了readr 中的某些内容。

以上是关于使用 readr 读取文本文件,其中引号结束行的主要内容,如果未能解决你的问题,请参考以下文章

在一个功能中添加 2 个逐行文本阅读器

单词长度

AS3:如何将数据网格中的数据保存到逐行文本文件中?

java_单词长度

如何在 QPlainTextEdit 小部件中突出显示整行文本?

在 r 中使用 readr 读取文件时的大整数