【发布时间】:2021-12-07 07:24:54
【问题描述】:
TL;DR 我想知道 readr 或 tibble 或任何 base/tidyverse 是否可以从 CSV 行的字符向量中生成一个 tibble(就像我对某个 CSV 文件执行了 read_lines() 一样)。
更多解释: 我正在将输出(来自 processx 对象的标准输出)收集到一个字符向量中,这个输出实际上是由子进程创建的 CSV 行。我想把它变成一个小标题,但我能找到的唯一函数是 data.table::fread (通过“文本”参数)。这是在一个包中,我真的不想仅仅为了这个功能而依赖 data.table。
我浏览了 tidyverse 文档,但找不到任何东西。我意识到我可以编写自己的解析器,我开始使用 map_def 和 str_split 来做,但后来我意识到有一些微妙之处,比如“如果逗号在引号内,请忽略它”等。也许我只是懒惰,但我没有当已经存在数百万个时,t 真的想实现一个完整的 csv 解析器。更不用说,速度问题。这个向量有时是 10k+ 行,我敢肯定我自制的方法不会是最优化的。
欢迎提出任何想法。也许我应该咬紧牙关,要么编写解析器,要么使用 data.table,但我觉得我不能成为第一个想要这样做的人,而且肯定有一些内置的东西我错过了。谢谢!
【问题讨论】:
-
但是您尝试了吗?
readr::read_csv("a,b\n1,2")有效,readr::read_csv(c("a,b","1,2"))也有效。除了 sindri_baldur 关于read.csv、data.table::fread和vroom::vroom的观点(尽管后者不接受字符串向量,只接受单个\n-delimited 字符串)。 -
嗯,这很容易。我以为我试过了,但我一定做错了什么。需要明确的是,虽然
read.csv()确实有效,正如下面的@sindri_baldur 所示,readr::read_csv(c("a,b","1,2"))确实不 有效并返回Error: 'a,b' does not exist in current working directory,这是我最初看到的。谢谢! -
有趣。
read_csv调用对我有用,没有错误;我在readr-1.3.1,也许readr-2改变了这种行为? .... 是的,它确实;请参阅cran.r-project.org/web/packages/readr/news/news.html,向下滚动到 "Literal data" 标题下的 2.0.0 版本,并看到它现在以不同方式解释向量 (len > 1)。你必须在readr-2.*。 -
啊,很棒的收获!我没有发布我正在使用的软件包版本的错误。确实
readr::read_csv(I(c("a,b","1,2")))确实 在readr >= 2.0.0中工作。谢谢。 -
公平点。而且,我很确定 readr 2.0.0 是在过去的一个月里刚刚问世的,所以不知何故,我发现自己处于突破性变化的最前沿!幸运的是,将向量包装在 I() 中适用于 2.0.0 之前和之后的阅读器。再次感谢。