使用 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 读取文本文件,其中引号结束行的主要内容,如果未能解决你的问题,请参考以下文章