J'écris un package R où le code R parle à une application Java. L'application Java génère une chaîne au format CSV et je veux que le code R être capable de lire directement la chaîne et de la convertir en un data.frame.
Modification d'une réponse vieille de 7 ans: À présent, c'est beaucoup plus simple grâce à l'argument text=
Qui a été ajouté à read.csv()
et pareil:
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>
Oui, regardez l'aide de textConnection()
- la notion très puissante dans R est que pratiquement tous les lecteurs (comme par exemple read.table()
et ses variantes) y accèdent connexion objet qui peut être un fichier, ou une URL distante, ou un tuyau provenant d'une autre application, ou ... du texte comme dans votre cas.
La même astuce est utilisée pour les documents dits ici:
> 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
>
Notez que c'est une façon simple de construire quelque chose mais c'est aussi coûteux en raison de l'analyse répétée de toutes les données. Il existe d'autres façons de passer de Java à R, mais cela devrait vous permettre de démarrer rapidement. L'efficacité vient ensuite ...
Notez que dans les versions actuelles de R, vous n'avez plus besoin de la textConnection()
, il est possible de faire simplement ceci:
> 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
Oui. Par exemple:
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
Supposons que vous ayez un fichier appelé tommy.csv (oui, imaginatif, je sais ...) qui a le contenu de
col1 col2\n 1 1\n 2 2\n 3 3
où chaque ligne est séparée par un caractère d'échappement "\ n".
Ce fichier peut être lu à l'aide de l'argument allowEscapes
dans read.table
.
> read.table("tommy.csv", header = TRUE, allowEscapes = TRUE)
col1 col2
1 col1 col2
2 1 1
3 2 2
4 3 3
Ce n'est pas parfait (modifier les noms des colonnes ...), mais c'est un début.
Cette fonction enveloppe la réponse de Dirk sous une forme pratique. C'est génial pour répondre aux questions sur SO, où le demandeur vient de vider les données à l'écran.
text_to_table <- function(text, ...)
{
dfr <- read.table(tc <- textConnection(text), ...)
close(tc)
dfr
}
Pour l'utiliser, copiez d'abord les données à l'écran et collez-les dans votre éditeur de texte.
foo bar baz
1 2 a
3 4 b
Maintenant, enveloppez-le avec text_to_table
, des citations et tout autre argument pour read.table
.
text_to_table("foo bar baz
1 2 a
3 4 b", header = TRUE)