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


82

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


您可以改用rJava包吗?
约书亚·乌尔里希

也许您可以在allow.Escapes中随意摆弄(在read.table中)。只要确保java输出使用\ n换行即可。
RomanLuštrik2010年

@Joshua我正在使用rJava与我的Java程序对话。我认为将我的重量级Java对象首先转换为字符串,然后再将其传递给R
效率更高。– Tommy chheng 2010年

汤米,是什么让您认为手动序列化比Simon放入rJava的效率更高?您是否对其中任何一项进行了基准测试?
德克·埃德比布特

1
也许高效是个错误的词。我的输入是类似哈希图的对象的数组,而我的输出是R data.frame。我没有在rJava中看到任何可以将java对象表示为data.frame的东西,因此我将对象格式化为字符串,然后将其转换为R data.frame。任何更有效的处理建议将不胜感激。
汤米·郑

Answers:


115

编辑一个已有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的方法,但这应该可以帮助您快速入门。效率紧随其后...


8
最新的R版本具有更简单的机制,请参见@Adam Bradley在此线程中的解答:stackoverflow.com/a/16349171/17523
Boris Gorelik

79

请注意,在当前的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

5
我知道这本身有点晚了,但是-将其作为对已接受答案的编辑提交可能会很有用,因为OP不太可能现在会更改已接受答案,但是现在看来这是更好的答案?
混淆时间

1
恕我直言,OP应该拒绝接受的答案,并接受这个答案……
Mischa


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

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



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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.