2012-01-30 62 views
133

如何將純文本文件導入爲R中的單個字符串?我認爲這可能會有一個非常簡單的答案,但是當我今天嘗試這個時,我發現我找不到執行此操作的函數。將文本文件導入爲單個字符串

例如,假設我有一個文件foo.txt與我想textmine的東西。

我試了一下:

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

但仍返回向量。我得到它的工作有點:

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

但這是一個相當醜陋的解決方案,可能也不穩定。

+5

'readr :: read_file'現在很好地解決了這個問題。 – Zach 2016-06-27 20:40:15

回答

156

下面是從@JoshuaUlrich解決方案的一個變種,使用正確的大小,而不是一個硬編碼的大小:

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

注意readChar您指定的字節數分配空間,所以readChar(fileName, .Machine$integer.max)不能很好地工作......

+0

+1對nash ='不懶惰。 :) – 2012-01-30 19:42:59

+14

值得指出的是,這段代碼不適用於壓縮文件。在這種情況下,file.info(文件名)$ size返回的字節數將與將在內存中讀取的實際內容不匹配,我們預計該內容會更大。 – asieira 2014-03-17 18:08:33

33

我會使用以下內容。它應該工作得很好,而且似乎並不難看,至少對我說:

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

我會期望'collapse =「\ n」'複製原始文件中這些是單獨行的事實。有了這個改變,這個解決方案*將*同樣適用於壓縮和未壓縮的文件。 – asieira 2014-03-17 18:09:30

+0

這似乎不起作用。如果我writeLines(singleString),我得到一個損壞的文件... – bumpkin 2014-10-28 18:13:48

+0

爲我工作。我有一個字符串文本文件,雖然 – hmi2015 2015-09-08 18:10:29

10

如何:

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

+1:我還添加了一個使用正確大小而不是'nchars = 1e6'的變體...... – Tommy 2012-01-30 19:38:18

1

readChar沒有太大的靈活性,所以我組合了您的解決方案(readLines和paste)。

我還增加了每條線之間的空間:

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

如果有些人依然在尋找這個問題的3年後,哈德利韋翰的readr包有一個方便read_file()功能,會爲你做到這一點。

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

唉「read_file」現在不會出現在stringr中。 :( http://cran.r-project.org/web/packages/stringr/stringr.pdf – 2015-05-26 14:41:28

+2

@mlk它已被遷移到'readr'。我已經更新了相應的答案 - 我希望Sharon不介意 – 2015-07-29 15:22:56

+1

不錯!同時解壓縮.gz文件 – 2016-04-14 19:58:38

2

太糟糕了,沙龍的解決方案不能再用了。我已經添加了喬希·奧布萊恩與asieira的修改解決我.Rprofile文件:

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

,並使用它像這樣:txt = read.text('path/to/my/file.txt')。我無法複製土匪的(28 oct。14)發現,並且writeLines(txt)顯示file.txt的內容。另外,write(txt, '/tmp/out')之後的命令diff /tmp/out path/to/my/file.txt報告沒有區別。

3

readr軟件包具有爲您做所有事情的功能。

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

這取代了包stringr中的版本。

相關問題