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

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

30700 次浏览

Editing a 7-year old answer: By now, this is much simpler thanks to the text= argument which has been added to read.csv() and alike:

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>

Yes, look at the help for textConnection() -- the very powerful notion in R is that essentially all readers (as e.g. read.table() and its variants) access these connection object which may be a file, or a remote URL, or a pipe coming in from another app, or ... some text as in your case.

The same trick is used for so-called here documents:

> 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
>

Note that this is a simple way for building something but it is also costly due to the repeated parsing of all the data. There are other ways to get from Java to R, but this should get you going quickly. Efficiency comes next...

Yes. For example:

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

Suppose you have a file called tommy.csv (yes, imaginative, I know...) that has the contents of

col1 col2 \n 1 1 \n 2 2 \n 3 3

where each line is separated with an escape character "\n".

This file can be read with the help of allowEscapes argument in read.table.

> read.table("tommy.csv", header = TRUE, allowEscapes = TRUE)


col1 col2
1 col1 col2
2    1    1
3    2    2
4    3    3

It's not perfect (modify column names...), but it's a start.

This function wraps Dirk's answer into a convenient form. It's brilliant for answering questions on SO, where the asker has just dumped the data onscreen.

text_to_table <- function(text, ...)
{
dfr <- read.table(tc <- textConnection(text), ...)
close(tc)
dfr
}

To use it, first copy the onscreen data and paste into your text editor.

foo bar baz
1 2 a
3 4 b

Now wrap it with text_to_table, quotes and any other arguments for read.table.

text_to_table("foo bar baz
1 2 a
3 4 b", header = TRUE)

Note that in now-current versions of R, you no longer need the textConnection(), it's possible to simply do this:

> 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

Using a tidyverse approach, you can just specify a text value

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