2012-01-30 12 views
133

¿Cómo se importa un archivo de texto plano como cadena de un solo carácter en R? Creo que esto probablemente tendrá una respuesta muy simple, pero cuando probé esto hoy, descubrí que no podía encontrar una función para hacer esto.Importar archivo de texto como cadena de un solo carácter

Por ejemplo, supongamos que tengo un archivo foo.txt con algo que quiero enviar.

he probado con:

scan("foo.txt", what="character", sep=NULL) 

pero esto sigue siendo un vector de regresar. Tengo que trabajar un poco con:

paste(scan("foo.txt", what="character", sep=" "),collapse=" ") 

pero eso es absolutamente una solución fea que es probablemente inestable también.

+5

'readr :: read_file' resuelve este problema muy bien ahora. – Zach

Respuesta

156

He aquí una variante de la solución de @JoshuaUlrich que utiliza el tamaño correcto en vez de un tamaño no modificable:

fileName <- 'foo.txt' 
readChar(fileName, file.info(fileName)$size) 

Tenga en cuenta que readChar asigna espacio para el número de bytes especificados, por lo readChar(fileName, .Machine$integer.max) no funciona bien ...

+0

+1 por no ser flojo con' nchars = '. :) –

+14

Vale la pena señalar que este código no funcionará para archivos comprimidos. En ese caso, la cantidad de bytes devueltos por file.info (filename) $ size no coincidirá con el contenido real que se leerá en la memoria, que esperamos sea más grande. – asieira

33

Utilizaría lo siguiente. Se debería funcionar bien, y no parece feo, al menos para mí:

singleString <- paste(readLines("foo.txt"), collapse=" ") 
+11

Hubiera esperado 'collapse =" \ n "' replicar el hecho de que estas son líneas separadas en el archivo original. Con este cambio, esta solución * * funcionará igualmente bien para los archivos comprimidos y no comprimidos. – asieira

+0

Esto no parece funcionar. Si escribo líneas (singleString), obtengo un archivo dañado ... – bumpkin

+0

Funcionó para mí.Aunque tuve un archivo de texto de cadena – hmi2015

10

¿Qué tal:

string <- readChar("foo.txt",nchars=1e6) 
+2

+1: También agregué una variante que usa el tamaño correcto en lugar de 'nchars = 1e6' ... – Tommy

1

readChar no tiene mucha flexibilidad, así que combiné sus soluciones (líneas de lectura y pegado).

También he añadido un espacio entre cada línea:

con <- file("/Users/YourtextFile.txt", "r", blocking = FALSE) 
singleString <- readLines(con) # empty 
singleString <- paste(singleString, sep = " ", collapse = " ") 
close(con) 
77

Por si alguien todavía está mirando a esta pregunta 3 años más tarde, el paquete readr de Hadley Wickham tiene una read_file() práctica función que va a hacer esto para usted.

install.packages("readr") # you only need to do this one time on your system 
library(readr) 
mystring <- read_file("path/to/myfile.txt") 
+1

Alas "read_file" no aparece ahora en stringr. :( http://cran.r-project.org/web/packages/stringr/stringr.pdf –

+2

@mlk ha sido migrado a 'readr'. He actualizado la respuesta en consecuencia. Espero que a Sharon no le importe –

+1

nice! También descomprime archivos .gz sobre la marcha –

2

Lástima que la solución de Sharon ya no se puede usar. He añadido la solución de Josh O'Brien con la modificación de asieira a mi archivo .Rprofile:

read.text = function(pathname) 
{ 
    return (paste(readLines(pathname), collapse="\n")) 
} 

y utilizar de esta manera: txt = read.text('path/to/my/file.txt'). No pude replicar el hallazgo de bumpkin (28 oct.14), y writeLines(txt) mostró el contenido de file.txt. Además, después de write(txt, '/tmp/out'), el comando diff /tmp/out path/to/my/file.txt no informó diferencias.

3

El paquete readr tiene una función para hacer todo por usted.

install.packages("readr") # you only need to do this one time on your system 
library(readr) 
mystring <- read_file("path/to/myfile.txt") 

Esto reemplaza la versión en el paquete stringr.

Cuestiones relacionadas