Impor file teks sebagai string karakter tunggal


204

Bagaimana Anda mengimpor file teks biasa sebagai string karakter tunggal di R? Saya pikir ini mungkin akan memiliki jawaban yang sangat sederhana tetapi ketika saya mencoba ini hari ini saya menemukan bahwa saya tidak dapat menemukan fungsi untuk melakukan ini.

Sebagai contoh, misalkan saya memiliki file foo.txtdengan sesuatu yang saya ingin textmine.

Saya mencobanya dengan:

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

tetapi ini masih mengembalikan vektor. Saya membuatnya bekerja dengan:

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

tetapi itu adalah solusi yang jelek yang mungkin juga tidak stabil.


20
readr::read_fileMemecahkan masalah ini dengan baik sekarang.
Zach

Jawaban:


213

Berikut adalah varian solusi dari @JoshuaUlrich yang menggunakan ukuran yang benar dan bukan ukuran yang dikodekan:

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

Perhatikan bahwa readChar mengalokasikan ruang untuk jumlah byte yang Anda tentukan, jadi readChar(fileName, .Machine$integer.max)tidak berfungsi dengan baik ...


18
Perlu ditunjukkan bahwa kode ini tidak akan berfungsi untuk file terkompresi. Jika demikian, jumlah byte yang dikembalikan oleh file.info (nama file) ukuran $ tidak akan cocok dengan konten aktual yang akan dibaca dalam memori, yang kami perkirakan akan lebih besar.
asieira

146

Jika ada yang masih melihat pertanyaan ini 3 tahun kemudian, paket readr Hadley Wickham memiliki read_file()fungsi praktis yang akan melakukan ini untuk Anda.

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

2
Sayangnya "read_file" tidak muncul di stringr sekarang. :( cran.r-project.org/web/packages/stringr/stringr.pdf
Michael Lloyd Lee mlk

7
@mlk, ini telah dimigrasi ke readr. Saya telah memperbarui jawabannya sesuai - saya harap Sharon tidak keberatan.
Nick Kennedy

1
bagus! juga mendekompresi file .gz dengan cepat
Andre Holzner

Saya mendapat could not find function "pase"kode ini
Sashko Lykhenko

47

Saya akan menggunakan yang berikut ini. Ini seharusnya bekerja dengan baik, dan tidak terlihat jelek, setidaknya bagi saya:

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

15
Saya akan berharap collapse="\n"untuk meniru fakta bahwa ini adalah baris yang terpisah pada file asli. Dengan perubahan ini, solusi ini akan bekerja untuk file terkompresi dan tidak terkompresi dengan baik.
asieira

Ini sepertinya tidak berhasil. Jika saya menulisLines (singleString), saya mendapatkan file yang rusak ...
bumpkin

Ini tidak berfungsi jika baris terakhir tidak menyertakan karakter garis akhir. Dalam hal ini, baris terakhir tidak termasuk dalam string (atau, file terpotong pada jeda baris terakhir).
gvrocha

Ini akan berfungsi dengan baik untuk membaca file teks seperti dalam pencarian OP: koneksi file teks secara blocking=TRUEdefault sehingga readLines()akan mengembalikan file lengkap hanya dengan peringatan tentang karakter EOL yang hilang. Namun, komentar @ gvrocha patut diperhatikan: pahami jenis koneksi Anda! ? readLines help saysIf 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

Paket readr memiliki fungsi untuk melakukan segalanya untuk Anda.

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

Ini menggantikan versi dalam string paket.


5

Sayang sekali bahwa solusi Sharon tidak dapat digunakan lagi. Saya telah menambahkan solusi Josh O'Brien dengan modifikasi asieira ke file .Rprofile saya:

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

dan menggunakannya seperti ini: txt = read.text('path/to/my/file.txt'). Saya tidak bisa meniru temuan bumpkin (28 Oktober 14), dan writeLines(txt)menunjukkan isinya file.txt. Juga, setelah write(txt, '/tmp/out')perintah diff /tmp/out path/to/my/file.txtmelaporkan tidak ada perbedaan.


2

readChar tidak memiliki banyak fleksibilitas sehingga saya menggabungkan solusi Anda (readLines dan paste)

Saya juga menambahkan spasi di antara setiap baris:

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

1

Sepertinya solusi Anda tidak terlalu jelek. Anda bisa menggunakan fungsi dan menjadikannya proffesional seperti cara-cara ini

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

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

new.function()

1
Ini tidak menambahkan apa pun pada jawaban yang diberikan oleh @Tommy . Menyediakan jalur dalam lingkungan fungsi adalah solusi yang buruk.
Konrad
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.