有没有一种方法可以使用read.csv来读取字符串值而不是R中的文件?
我正在编写一个R包,其中R代码与Java应用程序对话。Java应用程序输出一个CSV格式的字符串,我希望R代码能够直接读取该字符串并将其转换为data.frame。编辑一个7年前的答案:现在,由于有没有一种方法可以使用read.csv来读取字符串值而不是R中的文件?,r,csv,file-io,read.csv,R,Csv,File Io,Read.csv,我正在编写一个R包,其中R代码与Java应用程序对话。Java应用程序输出一个CSV格式的字符串,我希望R代码能够直接读取该字符串并将其转换为data.frame。编辑一个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>
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>
请注意,这是构建某些内容的简单方法,但由于重复解析所有数据,因此成本也很高。从Java到R还有其他方法,但这应该可以让您快速地进行。其次是效率…是的。例如:
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
string假设您有一个名为tommy.csv的文件(是的,imaginative,我知道…),其中包含
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
text_to_table("foo bar baz
1 2 a
3 4 b", header = TRUE)
它并不完美(修改列名…),但这只是一个开始。此函数将德克的答案包装成一种方便的形式。这对于回答提问者刚刚在屏幕上发布数据的问题来说是非常棒的
text_to_table <- function(text, ...)
{
dfr <- read.table(tc <- textConnection(text), ...)
close(tc)
dfr
}
请注意,在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
使用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
库(readr)
读取\u csv(file=“col1,col2\nfo,1\nbar,2”)
#一个tibble:2x2
col1 col2
1富1
2巴2
您可以改用rJava软件包吗?也许您可以随意使用allowEscapes(在read.table中)。请确保java输出使用\n断线。@Joshua我正在使用rJava与我的java程序对话。我认为在将我的重磅java对象传递到R之前,先将其转换为字符串更有效。Tommy,是什么让你认为手动序列化比Simon在rJava中所做的更有效?你有没有测试过这些?也许效率是个错误的词。我的输入是一个类似hashmap的对象数组,输出是一个R data.frame。我在rJava中没有看到任何允许我将java对象表示为data.frame的内容,因此我将对象格式化为字符串,然后将其转换为R data.frame。任何更有效的建议都将不胜感激。我知道这本身有点晚了,但-也许将此作为已接受答案的编辑提交可能会有用,因为OP现在不太可能更改已接受的答案,但这似乎是更好的答案?嗯,OP应该不接受已接受的答案,接受这一点…更新的R版本有一个更简单的机制,请参见本帖中@Adam Bradley的答案:
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