将文本文件导入为单个字符串

时间:2012-01-30 17:54:11

标签: r

如何在R中将纯文本文件作为单个字符串导入?我认为这可能有一个非常简单的答案,但是当我今天尝试这个时,我发现我找不到这样做的功能。

例如,假设我有一个文件foo.txt,其中包含我想要文本化的内容。

我尝试过:

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

但这仍然返回了一个向量。我得到了一些工作:

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

但这是一个非常丑陋的解决方案,也可能不稳定。

8 个答案:

答案 0 :(得分:191)

以下是来自@JoshuaUlrich的解决方案的变体,它使用正确的大小而不是硬编码的大小:

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

请注意,readChar为您指定的字节数分配空间,因此readChar(fileName, .Machine$integer.max)不能很好地运行...

答案 1 :(得分:119)

如果3年后有人还在看这个问题,Hadley Wickham的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")

答案 2 :(得分:40)

我会使用以下内容。它应该工作得很好,并且看起来并不丑,至少对我而言:

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

答案 3 :(得分:11)

怎么样:

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

答案 4 :(得分:6)

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中的版本。

答案 5 :(得分:3)

太糟糕了Sharon的解决方案不能再使用了。我已经通过asieira对我的.Rprofile文件的修改添加了Josh O'Brien的解决方案:

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

并像这样使用它:txt = read.text('path/to/my/file.txt')。我无法复制bumpkin(28 oct.14)的发现,writeLines(txt)显示file.txt的内容。此外,在write(txt, '/tmp/out')之后,命令diff /tmp/out path/to/my/file.txt报告没有差异。

答案 6 :(得分:1)

readChar不具备很大的灵活性,因此我将您的解决方案(readLines和paste)结合起来。

我还在每一行之间添加了一个空格:

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

答案 7 :(得分:1)

看来您的解决方案并不难看。您可以通过以下方式使用功能并使之专业化

  • 第一种方式
new.function <- function(filename){
  readChar(filename, file.info(filename)$size)
}

new.function('foo.txt')
  • 第二种方式
new.function <- function(){
  filename <- 'foo.txt'
  return (readChar(filename, file.info(filename)$size))
}

new.function()