有没有办法使用read.csv读取string值而不是R中的文件?
我正在编写一个R程序包,其中的R代码与Java应用程序交谈。 Java应用程序输出CSV格式的string,我希望R代码能够直接读取string并将其转换为data.frame。
是的,看看textConnection()
的帮助 – R中非常强大的概念是,基本上所有的读者(例如read.table()
及其变体)都可以访问这些连接对象,这可能是一个文件或远程URL,或从另一个应用程序进来的pipe道,或…一些文本,在你的情况。
这里所谓的文件使用了相同的技巧:
> 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 >
请注意,这是构build一些东西的一个简单方法,但由于重复parsing所有数据,这也是代价高昂的。 还有其他的方法可以从Java到R,但这应该让你快点。 效率接下来…
编辑一个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>
请注意,在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
假设你有一个名为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
这并不完美(修改列名…),但这是一个开始。
这个函数将Dirk的答案包装成一个方便的forms。 回答关于SO的问题,提问者只是在屏幕上倾倒数据,这是非常棒的。
text_to_table <- function(text, ...) { dfr <- read.table(tc <- textConnection(text), ...) close(tc) dfr }
要使用它,首先复制屏幕上的数据并粘贴到您的文本编辑器。
foo吧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)