Metin dosyasını tek karakter dizesi olarak içe aktar


205

Düz metin dosyasını R'de tek karakter dizesi olarak nasıl içe aktarırsınız? Bunun çok basit bir cevabı olacağını düşünüyorum, ama bugün bunu denediğimde bunu yapacak bir fonksiyon bulamadığımı fark ettim.

Örneğin, foo.txtmetin oluşturmak istediğim bir şey içeren bir dosyam olduğunu varsayalım.

Ben denedim:

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

ama bu yine de bir vektör döndürdü. Ben biraz ile çalışma var:

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

ama bu oldukça çirkin bir çözüm ve muhtemelen dengesiz.


20
readr::read_fileşimdi bu sorunu güzelce çözüyor.
Zach

Yanıtlar:


214

İşte @JoshuaUlrich'in sabit kodlu boyut yerine doğru boyutu kullanan bir çözümü var:

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

ReadChar'in belirttiğiniz bayt sayısı için yer ayırdığını unutmayın, bu nedenle readChar(fileName, .Machine$integer.max)iyi çalışmaz ...


18
Bu kodun sıkıştırılmış dosyalar için çalışmayacağını belirtmek gerekir. Bu durumda, file.info (dosyaadı) $ size tarafından döndürülen bayt sayısı, daha büyük olmasını beklediğimiz bellekte okunacak gerçek içerikle eşleşmez.
Mart'ta asieira

146

3 yıl sonra birisinin hala bu soruya bakması durumunda, Hadley Wickham'ın readr paketinin read_file()bunu sizin için yapacak kullanışlı bir işlevi vardır.

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

2
Alas "read_file" dizgisinde artık görünmüyor. :( cran.r-project.org/web/packages/stringr/stringr.pdf
Michael Lloyd Lee mlk

8
@mlk adresine taşındı readr. Cevabı buna göre güncelledim - umarım Sharon umursamaz.
Nick Kennedy

2
Güzel ! ayrıca .gz dosyalarını anında
açar

could not find function "pase"Bu kodu aldım
Sashko Lykhenko

47

Aşağıdakileri kullanırdım. En azından benim için iyi çalışmalı ve çirkin görünmüyor:

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

15
Ben umuyordum collapse="\n"bu orijinal dosya üzerinde ayrı çizgiler olduğu gerçeğini çoğaltmak için. Bu değişiklikle, bu çözüm olacaktır eşit derecede iyi sıkıştırılmış ve sıkıştırılmamış dosyalar için çalışır.
asieira

Bu işe yaramıyor gibi görünüyor. Lines (singleString) yazarsam, bozuk bir dosya alırım ...
bumpkin

Son satır satır sonu karakteri içermiyorsa bu çalışmaz. Bu durumda, son satır dizeye dahil edilmez (alternatif olarak, dosya son satır sonundan kesilir).
gvrocha

Bu, OP'nin sorgusunda olduğu gibi metin dosyalarını okumak için iyi çalışır: Metin dosyası bağlantıları blocking=TRUEvarsayılan olarak bu nedenle readLines()tam EOL karakteri hakkında bir uyarı ile tam dosyayı döndürür. Ancak @ gvrocha'nın yorumu dikkat çekmeye değer: bağlantı türünüzü anlayın! ? readLines yardım diyorIf 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

Readr paketinin sizin için her şeyi yapacak bir işlevi vardır.

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

Bu, stringr paketindeki sürümün yerini alır.


5

Sharon'un çözümünün artık kullanılamayacağı çok kötü. Josh O'Brien'in çözümünü asieira'nın modifikasyonuyla .Rprofile dosyama ekledim:

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

ve bu gibi kullanmak: txt = read.text('path/to/my/file.txt'). Bumpkin'in (28 Ekim 14) bulgusunu kopyalayamadım writeLines(txt)ve içeriğini gösterdim file.txt. Ayrıca, write(txt, '/tmp/out')komuttan sonra diff /tmp/out path/to/my/file.txthiçbir fark bildirmedi.


2

readChar çok fazla esnekliğe sahip olmadığından çözümlerinizi birleştirdim (readLines and paste).

Ayrıca her satır arasına bir boşluk ekledim:

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

1

Çözümünüz çok çirkin görünmüyor. İşlevleri kullanabilir ve bu gibi profesyonel hale getirebilirsiniz

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

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

new.function()

1
Bu @Tommy tarafından verilen cevaba hiçbir şey katmaz . Bir işlev ortamında yol sağlamak özellikle zayıf bir çözümdür.
Konrad
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.