【问题标题】:Read from character vector CSV to tibble in R从字符向量 CSV 读取到 R 中的 tibble
【发布时间】: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.csvdata.table::freadvroom::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 之前和之后的阅读器。再次感谢。

标签: r tidyverse readr


【解决方案1】:

read.csv 不工作吗?

read.csv(
  text = "a,b
          1,2",
  header = TRUE
)

#   a b
# 1 1 2

【讨论】:

  • 这行得通,虽然 OP 是关于矢量的,但 read.csv(text = c("a,b","1,2"), header = TRUE) 也可以工作(尽管如上所述,它确实readr::read_csv() 一起工作。谢谢!
  • @seth127 我认为您可以根据需要粘贴/拆分向量,然后再将它们提供给 read.csv()。
  • 是的,但出于速度原因,我不希望这样做。如前所述,此数据可能有点大。不过谢谢你,这很好用。
猜你喜欢
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多