Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以使用read.csv来读取字符串值而不是R中的文件?_R_Csv_File Io_Read.csv - Fatal编程技术网

有没有一种方法可以使用read.csv来读取字符串值而不是R中的文件?

有没有一种方法可以使用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>

我正在编写一个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> 
请注意,这是构建某些内容的简单方法,但由于重复解析所有数据,因此成本也很高。从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