Y at-il un moyen d'utiliser read.csv pour lire à partir d'une valeur de chaîne plutôt que d'un fichier dans R?

StackOverflow https://stackoverflow.com/questions/3936285

  •  30-09-2019
  •  | 
  •  

Question

J'écris un paquet de R où les pourparlers de code R à une application Java. L'application Java affiche une chaîne au format CSV et je veux le code R pour pouvoir lire directement la chaîne et le convertir en un data.frame.

Était-ce utile?

La solution

Modification d'une ancienne réponse 7 ans: Maintenant, cela est beaucoup plus simple grâce à l'argument text= qui a été ajouté à read.csv() et aussi bien:

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() - très puissant notion en R est que pratiquement tous les lecteurs (comme par exemple read.table() et ses variantes) l'accès de ces Connexion objet qui peut être un fichier ou une URL à distance, ou un tuyau venant d'une autre application, ou ... un texte comme dans votre cas.

La même astuce est utilisé pour ce qu'on appelle ici les 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
> 

Notez que ceci est un simple, voie à construire quelque chose, mais il est également coûteux en raison de l'analyse répétée de toutes les données. Il existe d'autres façons d'obtenir de Java à R, mais vous devriez y aller rapidement. L'efficacité vient ensuite ...

Autres conseils

Notez que dans les versions maintenant actuelles de R, vous ne avez plus besoin 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 avez 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 d'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

Il est parfait pas (modifier les noms de colonnes ...), mais il est un début.

Cette fonction enveloppe la réponse de Dirk en une forme pratique. Il est génial pour répondre à des questions sur le SO, où le demandeur vient déversé les données à l'écran.

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

Pour l'utiliser, d'abord copier les données à l'écran et le coller dans votre éditeur de texte.

  

foo bar baz
  1 2 a
  3 4 b

Maintenant, l'envelopper avec text_to_table, citations et autres arguments pour read.table.

text_to_table("foo bar baz
1 2 a
3 4 b", header = TRUE)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top