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


204

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

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

我尝试了:

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

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

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

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


20
readr::read_file现在很好地解决了这个问题。
扎克

Answers:


213

这是@JoshuaUlrich解决方案的一种变体,它使用正确的大小而不是硬编码的大小:

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

请注意,readChar会为您指定的字节数分配空间,因此readChar(fileName, .Machine$integer.max)效果不佳...


18
值得指出的是,此代码不适用于压缩文件。在这种情况下,file.info(filename)$ size返回的字节数将与将在内存中读取的实际内容不匹配,我们希望该内容会更大。
asieira 2014年

146

如果3年后仍然有人在看这个问题,Hadley Wickham的阅读器程序包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
las,“ read_file”现在没有出现在纵梁中。:( cran.r-project.org/web/packages/stringr/stringr.pdf
Michael Lloyd Lee mlk

7
@mlk已迁移到readr。我已经相应地更新了答案-希望沙龙不介意。
尼克·肯尼迪

1
真好!还可以动态解压缩.gz文件
Andre Holzner 2016年

我收到could not find function "pase"了此代码
Sashko Lykhenko

47

我将使用以下内容。至少对我来说,它应该可以正常工作,而且看起来也不难看:

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

15
我本来希望collapse="\n"复制以下事实:这些是原始文件中的单独行。进行此更改后,此解决方案同样适用于压缩和未压缩的文件。
asieira 2014年

这似乎不起作用。如果我writeLines(singleString),我得到一个已损坏的文件...
土包子

如果最后一行不包含行尾字符,则此方法不起作用。在这种情况下,字符串中不包括最后一行(或者,文件在最后一个换行符处被截断)。
gvrocha

像在OP的任务中一样,这对于读取文本文件将很好地工作:文本文件连接是blocking=TRUE默认设置,因此readLines()将返回完整的文件,只是带有关于缺少EOL字符的警告。但是@gvrocha的评论值得关注:了解您的连接类型!?readLines帮助说If 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

阅读器软件包具有为您做所有事情的功能。

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

这将替换程序包中的版本。


5

太糟糕了,无法再使用Sharon的解决方案。我已经将Josh O'Brien的解决方案以及对asieira的修改添加到了.Rprofile文件中:

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

并像这样使用它:txt = read.text('path/to/my/file.txt')。我无法复制布金(10月28日)的发现,并writeLines(txt)显示的内容file.txt。另外,write(txt, '/tmp/out')命令后diff /tmp/out path/to/my/file.txt报告无差异。


2

readChar没有太大的灵活性,因此我将您的解决方案(readLines和粘贴)组合在一起。

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

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

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()

1
这不会为@Tommy提供的答案添加任何内容。在功能环境中提供路径是特别糟糕的解决方案。
康拉德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.