85

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

4

6 回答 6

125

编辑一个 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 的方法,但这应该能让你快速上手。接下来是效率...

于 2010-10-14T18:27:29.980 回答
80

请注意,在当前的 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
于 2013-05-02T23:06:03.160 回答
4

是的。例如:

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
于 2010-10-14T18:30:30.100 回答
1

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

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

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

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

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

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

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

于 2010-10-14T18:35:06.873 回答
1

使用 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
于 2020-03-11T11:08:19.830 回答
0

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

text_to_table <- function(text, ...)
{
   dfr <- read.table(tc <- textConnection(text), ...)
   close(tc)
   dfr
}

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

foo bar baz
1 2 a
3 4 b

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

text_to_table("foo bar baz
1 2 a
3 4 b", header = TRUE)
于 2010-10-15T09:52:00.770 回答