2012-01-30 48 views
133

Làm thế nào để bạn nhập tệp văn bản thuần túy 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ử điều này 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.Nhập tệp văn bản dưới dạng chuỗi ký tự đơn

Ví dụ: giả sử tôi có một tệp foo.txt với nội dung nào đó mà tôi muốn textmine.

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

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

nhưng điều này vẫn quay trở lại một vector. Tôi thấy nó hoạt động phần nào với:

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

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

+5

'readr :: read_file' giải quyết vấn đề này một cách độc đáo ngay bây giờ. – Zach

Trả lời

156

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

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, vì vậy readChar(fileName, .Machine$integer.max) không làm việc tốt ...

+0

+1 vì không lười về' nchars = '. :) –

+14

Nó là giá trị chỉ ra rằng mã này sẽ không làm việc cho các tập tin 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 ta mong đợi sẽ lớn hơn. – asieira

33

Tôi sẽ sử dụng các mục sau. Nó sẽ làm việc tốt, và dường như không xấu xí, ít nhất là với tôi:

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

Tôi đã mong đợi 'collapse =" \ n "' để tái tạo 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

+0

Đ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 ... – bumpkin

+0

Đã làm việc cho tôi.Tôi đã có một tập tin văn bản chuỗi mặc dù – hmi2015

10

Làm thế nào về:

string <- readChar("foo.txt",nchars=1e6) 
+2

+1: Tôi cũng đã thêm một biến thể sử dụng đúng kích thước thay vì 'nchars = 1e6' ... – Tommy

1

readChar không có nhiều tính linh hoạt để tôi kết hợp các giải pháp của bạn (readLines and 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) 
77

Trong trường hợp bất cứ ai vẫn đang nhìn vào câu hỏi này 3 năm sau, gói readr Hadley Wickham có read_file() chức năng tiện dụng mà sẽ làm việc 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") 
+1

Than ôi "read_file" không xuất hiện trong stringr bây giờ. :( http://cran.r-project.org/web/packages/stringr/stringr.pdf –

+2

@mlk nó đã được di chuyển sang 'readr'. Tôi đã cập nhật câu trả lời cho phù hợp - tôi hy vọng Sharon không bận tâm –

+1

cũng giải nén các tập tin .gz trên bay –

2

Rất tệ khi không thể sử dụng giải pháp của Sharon nữa. Tôi đã thêm giải pháp Josh O'Brien với sửa đổi asieira để tập .Rprofile tôi:

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ể tái tạo lại dấu vết (28 oct. 14) của bumpkin và writeLines(txt) cho thấy nội dung của file.txt. Ngoài ra, sau khi write(txt, '/tmp/out') lệnh diff /tmp/out path/to/my/file.txt báo cáo không có sự khác biệt.

3

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 gói stringr.

Các vấn đề liên quan