Est-il possible d’utiliser read.csv pour lire une valeur de chaîne plutôt qu’un fichier dans R?

J’écris un paquet R où le code R parle à une application Java. L’application Java génère une chaîne au format CSV et je souhaite que le code R puisse lire directement la chaîne et la convertir en data.frame.

Editer une réponse de 7 ans: A présent, c’est beaucoup plus simple grâce à l’argument text= qui a été ajouté à read.csv() et similaire:

 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 pour textConnection() – la notion très puissante dans R est que essentiellement tous les lecteurs (par exemple read.table() et ses variantes) accèdent à cet object de connexion qui peut être un fichier ou une URL distante, ou un tuyau provenant d’une autre application, ou … du texte comme dans votre cas.

Le même truc est utilisé pour les documents appelés 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 un moyen simple de créer quelque chose, mais cela est également coûteux en raison de l’parsing répétée de toutes les données. Il existe d’autres moyens de passer de Java à R, mais cela devrait vous permettre de progresser rapidement. L’efficacité vient ensuite …

Notez que dans les versions actuelles de R, vous n’avez plus besoin de textConnection() , il est possible de le faire simplement:

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

 ssortingng <- "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 read.table 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 de colonnes …), mais c’est un début.

Cette fonction enveloppe la réponse de Dirk sous une forme pratique. Il est génial de 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)