我正在编写一个R包,其中R代码与Java应用程序交互。Java应用程序输出一个CSV格式的字符串,我希望R代码能够直接读取该字符串并将其转换为数据框。
我正在编写一个R包,其中R代码与Java应用程序交互。Java应用程序输出一个CSV格式的字符串,我希望R代码能够直接读取该字符串并将其转换为数据框。
编辑一篇已有七年历史的答案:现在,由于read.csv()
和类似函数添加了text=
参数,这变得简单多了:
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()
及其变体)都访问这些连接对象,可以是一个文件,或者一个来自另一个应用程序的管道,或者...像你这种情况下的一些文本。> 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 版本中,您不再需要使用 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
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
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.table("tommy.csv", header = TRUE, allowEscapes = TRUE)
col1 col2
1 col1 col2
2 1 1
3 2 2
4 3 3
虽然不完美(修改列名...),但这是一个开始。
这个函数将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)