Importar arquivo de texto como sequência de caracteres únicos


204

Como você importa um arquivo de texto sem formatação como uma sequência de caracteres únicos no R? Acho que isso provavelmente terá uma resposta muito simples, mas quando tentei hoje, descobri que não conseguia encontrar uma função para fazer isso.

Por exemplo, suponha que eu tenha um arquivo foo.txtcom algo que eu queira textmine.

Eu tentei com:

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

mas isso ainda retornou um vetor. Eu consegui trabalhar um pouco com:

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

mas essa é uma solução bastante feia que provavelmente também é instável.


20
readr::read_fileresolve esse problema muito bem agora.
Zach

Respostas:


213

Aqui está uma variante da solução de @JoshuaUlrich que usa o tamanho correto em vez de um tamanho codificado:

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

Observe que o readChar aloca espaço para o número de bytes que você especificar, portanto readChar(fileName, .Machine$integer.max), não funciona bem ...


18
Vale ressaltar que esse código não funcionará para arquivos compactados. Nesse caso, o número de bytes retornados por file.info (nome do arquivo) $ size não corresponderá ao conteúdo real que será lido na memória, que esperamos ser maior.
Asieira

146

Caso alguém ainda esteja estudando essa questão três anos depois, o pacote readr de Hadley Wickham tem uma read_file()função útil que fará isso por você.

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

2
Infelizmente, "read_file" não aparece no stringr agora. :( cran.r-project.org/web/packages/stringr/stringr.pdf
Michael Lloyd Lee mlk

7
@mlk foi migrado para readr. Atualizei a resposta de acordo. Espero que Sharon não se importe.
Nick Kennedy

1
legais ! também descompacta arquivos .gz on the fly
Andre Holzner

Eu cheguei could not find function "pase"neste código
Sashko Lykhenko

47

Eu usaria o seguinte. Deve funcionar muito bem, e não parece feio, pelo menos para mim:

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

15
Eu esperava collapse="\n"replicar o fato de que essas são linhas separadas no arquivo original. Com esta mudança, esta solução irá trabalhar para arquivos compactados e não compactados igualmente bem.
Asieira 17/03/2014

Isso não parece funcionar. Se eu writeLines (singleString), recebo um arquivo corrompido ...
bumpkin

Isso não funciona se a última linha não incluir um caractere de fim de linha. Nesse caso, a última linha não é incluída na string (como alternativa, o arquivo é truncado na última quebra de linha).
gvrocha

Isso funcionará bem para a leitura de arquivos de texto, como na pergunta do OP: As conexões de arquivos de texto são blocking=TRUEpor padrão; portanto readLines(), retornará o arquivo completo apenas com um aviso sobre o caractere EOL ausente. No entanto, o comentário de @ gvrocha merece atenção: entenda o seu tipo de conexão! ? readLines ajuda dizIf the final line is incomplete (no final EOL marker) the behaviour depends on whether the connection is blocking or not. For a non-blocking text-mode connection the incomplete line is pushed back, silently. **For all other connections the line will be accepted, with a warning.**
krads


8

O pacote readr tem uma função para fazer tudo por você.

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

Isso substitui a versão no pacote stringr.


5

Pena que a solução de Sharon não possa mais ser usada. Adicionei a solução de Josh O'Brien com a modificação de asieira ao meu arquivo .Rprofile:

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

e usá-lo como este: txt = read.text('path/to/my/file.txt'). Não consegui replicar a descoberta de Bumpkin (28 de outubro de 14) e writeLines(txt)mostrei o conteúdo de file.txt. Além disso, após write(txt, '/tmp/out')o comando diff /tmp/out path/to/my/file.txtnão houve diferenças.


2

O readChar não tem muita flexibilidade, então eu combinei suas soluções (readLines e colar).

Também adicionei um espaço entre cada linha:

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

1

Parece que sua solução não é muito feia. Você pode usar funções e torná-lo profissional como estas

  • primeiro caminho
new.function <- function(filename){
  readChar(filename, file.info(filename)$size)
}

new.function('foo.txt')
  • segunda via
new.function <- function(){
  filename <- 'foo.txt'
  return (readChar(filename, file.info(filename)$size))
}

new.function()

1
Isso não adiciona nada à resposta fornecida pelo @Tommy . Fornecer caminho dentro de um ambiente funcional é uma solução particularmente ruim.
Konrad
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.