Nhập tệp văn bản dưới dạng chuỗi ký tự đơn


204

Làm thế nào để bạn nhập một tệp văn bản đơn giản dưới dạng chuỗi ký tự đơn trong R? Tôi nghĩ rằng điều này có thể sẽ có một câu trả lời rất đơn giản nhưng khi tôi thử nó ngày hôm nay tôi thấy rằng tôi không thể tìm thấy một chức năng để làm điều này.

Ví dụ: giả sử tôi có một tệp foo.txtcó nội dung tôi muốn nhắn tin.

Tôi đã thử nó với:

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

nhưng điều này vẫn trả về một vectơ. Tôi đã làm cho nó hoạt động với:

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

nhưng đó là một giải pháp khá xấu mà có lẽ cũng không ổn định.


20
readr::read_filegiải quyết vấn đề này độc đáo bây giờ.
Zach

Câu trả lời:


213

Đây là một biến thể của giải pháp từ @JoshuaUlrich sử dụng kích thước chính xác thay vì kích thước được mã hóa cứng:

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

Lưu ý rằng readChar phân bổ không gian cho số byte bạn chỉ định, do readChar(fileName, .Machine$integer.max)đó không hoạt động tốt ...


18
Cần lưu ý rằng mã này sẽ không hoạt động đối với các tệp nén. Trong trường hợp đó, số byte được trả về bởi file.info (tên tệp) $ size sẽ không khớp với nội dung thực tế sẽ được đọc trong bộ nhớ, mà chúng tôi dự kiến ​​sẽ lớn hơn.
asieira

146

Trong trường hợp bất cứ ai vẫn nhìn vào câu hỏi này 3 năm sau, gói readr của Hadley Wickham có một read_file()chức năng tiện dụng sẽ làm điều này cho bạn.

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

2
Than ôi "read_file" hiện không xuất hiện trong chuỗi. :( cran.r-project.org/web/packages/opesr/opesr.pdf
Michael Lloyd Lee mlk

7
@mlk nó đã được di chuyển đến readr. Tôi đã cập nhật câu trả lời tương ứng - Tôi hy vọng Sharon không phiền.
Nick Kennedy

1
đẹp ! cũng giải nén các tập tin .gz khi đang di chuyển
Andre Holzner

Tôi đã nhận được could not find function "pase"mã này
Sashko Lykhenko

47

Tôi sẽ sử dụng như sau. Nó sẽ hoạt động tốt, và không có vẻ xấu, ít nhất là với tôi:

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

15
Tôi đã dự kiến ​​sẽ collapse="\n"nhân rộng thực tế rằng đây là những dòng riêng biệt trên tệp gốc. Với thay đổi này, giải pháp này sẽ hoạt động cho các tệp nén và không nén tốt như nhau.
Asieira 17/03/2016

Điều này dường như không hoạt động. Nếu tôi writeLines (singleString), tôi nhận được một tập tin bị hỏng ...
người dù vụng về

Điều này không hoạt động nếu dòng cuối cùng không bao gồm một kết thúc của ký tự dòng. Trong trường hợp đó, dòng cuối cùng không được bao gồm trong chuỗi (cách khác, tệp bị cắt ở lần ngắt dòng cuối cùng).
gvrocha

Điều này sẽ hoạt động tốt để đọc các tệp văn bản như trong nhiệm vụ của OP: Các kết nối tệp văn bản blocking=TRUEtheo mặc định vì vậy readLines()sẽ trả về toàn bộ tệp chỉ với một cảnh báo về ký tự EOL bị thiếu. Tuy nhiên, nhận xét của @ gvrocha rất đáng được chú ý: hiểu loại kết nối của bạn! ? readLines help nóiIf 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

Gói readr có chức năng làm mọi thứ cho bạn.

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

Điều này thay thế phiên bản trong chuỗi Stringr.


5

Thật tệ là giải pháp của Sharon không thể được sử dụng nữa. Tôi đã thêm giải pháp của Josh O'Brien với sửa đổi của asieira vào tệp .Rprofile của mình:

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

và sử dụng nó như thế này : txt = read.text('path/to/my/file.txt'). Tôi không thể sao chép việc tìm kiếm (28 tháng 8) của gập bụng và writeLines(txt)hiển thị nội dung của file.txt. Ngoài ra, sau khi báo cáo write(txt, '/tmp/out')lệnh diff /tmp/out path/to/my/file.txtkhông có sự khác biệt.


2

readChar không có nhiều tính linh hoạt nên tôi đã kết hợp các giải pháp của bạn (readLines và paste).

Tôi cũng đã thêm một khoảng trắng giữa mỗi dòng:

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

1

Có vẻ như giải pháp của bạn không nhiều xấu xí. Bạn có thể sử dụng các chức năng và làm cho nó chuyên nghiệp như những cách này

  • cách đầu tiên
new.function <- function(filename){
  readChar(filename, file.info(filename)$size)
}

new.function('foo.txt')
  • cách thứ hai
new.function <- function(){
  filename <- 'foo.txt'
  return (readChar(filename, file.info(filename)$size))
}

new.function()

1
Điều này không thêm bất cứ điều gì vào câu trả lời được cung cấp bởi @Tommy . Cung cấp đường dẫn trong một môi trường chức năng là giải pháp đặc biệt kém.
Konrad
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.