Importieren Sie eine Textdatei als einzelne Zeichenfolge


204

Wie importiere ich eine Nur-Text-Datei als einzelne Zeichenfolge in R? Ich denke, dass dies wahrscheinlich eine sehr einfache Antwort haben wird, aber als ich dies heute versuchte, stellte ich fest, dass ich keine Funktion dafür finden konnte.

Angenommen, ich habe eine Datei foo.txtmit etwas, das ich textminieren möchte.

Ich habe es versucht mit:

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

Dies ergab jedoch immer noch einen Vektor. Ich habe es etwas zum Laufen gebracht mit:

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

aber das ist eine ziemlich hässliche Lösung, die wahrscheinlich auch instabil ist.


20
readr::read_filelöst dieses Problem jetzt gut.
Zach

Antworten:


213

Hier ist eine Variante der Lösung von @JoshuaUlrich, die anstelle einer fest codierten Größe die richtige Größe verwendet:

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

Beachten Sie, dass readChar Speicherplatz für die von Ihnen angegebene Anzahl von Bytes reserviert und daher readChar(fileName, .Machine$integer.max)nicht gut funktioniert ...


18
Es sei darauf hingewiesen, dass dieser Code für komprimierte Dateien nicht funktioniert. In diesem Fall stimmt die Anzahl der von file.info (Dateiname) $ zurückgegebenen Bytes nicht mit dem tatsächlichen Inhalt überein, der im Speicher gelesen wird, von dem wir erwarten, dass er größer ist.
Asieira

146

Für den Fall, dass sich 3 Jahre später noch jemand mit dieser Frage befasst, verfügt das Readr-Paket von Hadley Wickham über eine praktische read_file()Funktion, die dies für Sie erledigt .

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

2
Leider erscheint "read_file" jetzt nicht in stringr. :( cran.r-project.org/web/packages/stringr/stringr.pdf
Michael Lloyd Lee mlk

7
@mlk es wurde migriert readr. Ich habe die Antwort entsprechend aktualisiert - ich hoffe, Sharon hat nichts dagegen.
Nick Kennedy

1
nett ! dekomprimiert auch .gz-Dateien
Andre Holzner

Ich habe could not find function "pase"diesen Code erhalten
Sashko Lykhenko

47

Ich würde folgendes verwenden. Es sollte gut funktionieren und scheint zumindest für mich nicht hässlich zu sein:

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

15
Ich hätte erwartet collapse="\n", die Tatsache zu wiederholen, dass dies separate Zeilen in der Originaldatei sind. Mit dieser Änderung dieser Lösung wird ebenso gut für komprimierte und unkomprimierte Dateien arbeiten.
Asieira

Das scheint nicht zu funktionieren. Wenn ich Zeilen schreibe (singleString), bekomme ich eine beschädigte Datei ...
Bumpkin

Dies funktioniert nicht, wenn die letzte Zeile kein Zeilenendezeichen enthält. In diesem Fall ist die letzte Zeile nicht in der Zeichenfolge enthalten (alternativ wird die Datei beim letzten Zeilenumbruch abgeschnitten).
Gvrocha

Dies funktioniert gut zum Lesen von Textdateien, wie in der Frage des OP: Textdateiverbindungen sind blocking=TRUEstandardmäßig so readLines(), dass die vollständige Datei nur mit einer Warnung über das fehlende EOL-Zeichen zurückgegeben wird. Der Kommentar von @ gvrocha ist jedoch zu beachten: Verstehen Sie Ihren Verbindungstyp! ReadLines Hilfe sagtIf 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

Das readr-Paket hat die Funktion, alles für Sie zu erledigen.

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

Dies ersetzt die Version im Paket stringr.


5

Schade, dass Sharons Lösung nicht mehr verwendet werden kann. Ich habe Josh O'Briens Lösung mit Asieiras Modifikation zu meiner .Rprofile-Datei hinzugefügt:

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

und benutze es so : txt = read.text('path/to/my/file.txt'). Ich konnte Bumpkins (28. Oktober 14) Befund nicht wiederholen und writeLines(txt)zeigte den Inhalt von file.txt. Auch nach write(txt, '/tmp/out')dem Befehl diff /tmp/out path/to/my/file.txtwurden keine Unterschiede gemeldet.


2

readChar hat nicht viel Flexibilität, deshalb habe ich Ihre Lösungen (readLines und Einfügen) kombiniert.

Ich habe auch ein Leerzeichen zwischen jeder Zeile eingefügt:

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

1

Es scheint, dass Ihre Lösung nicht viel hässlich ist. Sie können Funktionen verwenden und sie auf diese Weise professionell gestalten

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

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

new.function()

1
Dies fügt der Antwort von @Tommy nichts hinzu . Das Bereitstellen eines Pfads innerhalb einer Funktionsumgebung ist eine besonders schlechte Lösung.
Konrad
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.