有没有办法使用 read.csv 从字符串值而不是 R 中的文件读取?

Posted

技术标签:

【中文标题】有没有办法使用 read.csv 从字符串值而不是 R 中的文件读取?【英文标题】:Is there a way to use read.csv to read from a string value rather than a file in R? 【发布时间】:2011-04-25 13:51:01 【问题描述】:

我正在编写一个 R 包,其中 R 代码与 Java 应用程序对话。 Java 应用程序输出一个 CSV 格式的字符串,我希望 R 代码能够直接读取该字符串并将其转换为 data.frame。

【问题讨论】:

你能用 rJava 包代替吗? 也许你可以摆弄allowEscapes(在read.table中)。只需确保 java 输出使用 \n 换行即可。 @Joshua 我正在使用 rJava 与我的 Java 程序对话。我认为在将我的重量级 java 对象传递给 R 之前先将其转换为字符串会更有效。 Tommy,是什么让您认为手动序列化比 Simon 放入 rJava 中的更高效?您是否对其中任何一个进行了基准测试? 也许高效是错误的词。我的输入是一个类似哈希图的对象数组,我的输出是一个 R data.frame。我在 rJava 中没有看到任何可以让我将 java 对象表示为 data.frame 的内容,因此我将对象格式化为字符串,然后将其转换为 R data.frame。任何更有效的处理此问题的建议将不胜感激。 【参考方案1】:

编辑一个 7 年前的答案:现在,由于 text= 参数已添加到 read.csv() 等,这要简单得多

R> data <- read.csv(text="flim,flam
+ 1.2,2.2
+ 77.1,3.14")
R> data
  flim flam
1  1.2 2.20
2 77.1 3.14
R> 

是的,请查看textConnection() 的帮助——R 中的非常强大的概念是基本上所有读者(例如read.table() 及其变体)都可以访问这些连接 对象,它可能是一个文件、一个远程 URL、或者来自另一个应用程序的管道,或者......像你的情况一样的一些文本。

同样的技巧用于所谓的here文档:

> lines <- "
+ flim,flam
+ 1.2,2.2
+ 77.1,3.14
+ "
> con <- textConnection(lines)
> data <- read.csv(con)
> close(con)
> data
  flim flam
1  1.2 2.20
2 77.1 3.14
> 

请注意,这是构建东西的简单方式,但由于重复解析所有数据,它也成本高。还有其他从 Java 到 R 的方法,但这应该能让你快速上手。接下来是效率……

【讨论】:

最近的 R 版本有一个更简单的机制,请参阅@Adam Bradley 在此线程中的答案:***.com/a/16349171/17523【参考方案2】:

是的。例如:

string <- "this,will,be\na,data,frame"
x <- read.csv(con <- textConnection(string), header=FALSE)
close(con)
#> x
#    V1   V2    V3
#1 this will    be
#2    a data frame

【讨论】:

【参考方案3】:

假设您有一个名为 tommy.csv 的文件(是的,富有想象力,我知道...),其内容为

col1 col2 \n 1 1 \n 2 2 \n 3 3

每行用转义字符“\n”分隔。

这个文件可以在read.table中的allowEscapes参数的帮助下读取。

> read.table("tommy.csv", header = TRUE, allowEscapes = TRUE)

  col1 col2
1 col1 col2
2    1    1
3    2    2
4    3    3

这并不完美(修改列名...),但这是一个开始。

【讨论】:

【参考方案4】:

此函数将 Dirk 的答案包装成一种方便的形式。回答关于 SO 的问题非常棒,因为提问者刚刚将数据转储到屏幕上。

text_to_table <- function(text, ...)

   dfr <- read.table(tc <- textConnection(text), ...)
   close(tc)
   dfr

要使用它,首先复制屏幕上的数据并粘贴到您的文本编辑器中。

富吧巴兹 1 2个 3 4 b

现在用text_to_table、引号和read.table 的任何其他参数包装它。

text_to_table("foo bar baz
1 2 a
3 4 b", header = TRUE)

【讨论】:

【参考方案5】:

请注意,在当前的 R 版本中,您不再需要 textConnection(),只需这样做:

> states.str='"State","Abbreviation"
+ "Alabama","AL"
+ "Alaska","AK"
+ "Arizona","AZ"
+ "Arkansas","AR"
+ "California","CA"'
> read.csv(text=states.str)
       State Abbreviation
1    Alabama           AL
2     Alaska           AK
3    Arizona           AZ
4   Arkansas           AR
5 California           CA

【讨论】:

我知道这本身有点晚了,但是 - 将其作为对已接受答案的编辑提交可能会很有用,因为 OP 现在不太可能更改已接受的答案,但现在似乎是更好的答案? 恕我直言,OP应该不接受接受的答案,并接受这个......【参考方案6】:

使用 tidyverse 方法,你可以只指定一个文本值

library(readr)
read_csv(file = "col1, col2\nfoo, 1\nbar, 2")
# A tibble: 2 x 2
 col1   col2
 <chr>  <dbl>
1 foo       1
2 bar       2

【讨论】:

以上是关于有没有办法使用 read.csv 从字符串值而不是 R 中的文件读取?的主要内容,如果未能解决你的问题,请参考以下文章

在 read.csv 期间使用限制的 Spark 推断架构

猫鼬返回默认值而不是空值

有没有办法从函数中获取值而不返回它? [关闭]

如果多次单击一个选项,有没有办法只为 setOnItemClickListener 获取单个值而不是获取多个值?

使用 UTF-8 编码的 read.csv() [重复]

熊猫读取excel值而不是公式