Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将文本文件作为单个字符串导入_R - Fatal编程技术网

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

R 将文本文件作为单个字符串导入,r,R,如何在R中将纯文本文件作为单个字符串导入?我想这可能会有一个非常简单的答案,但当我今天尝试这一点时,我发现我找不到一个函数来实现这一点 例如,假设我有一个文件foo.txt,其中包含我想要文本挖掘的内容 我试了一下: scan("foo.txt", what="character", sep=NULL) 但这仍然返回了一个向量。我在某种程度上利用了: paste(scan("foo.txt", what="character", sep=" "),collapse=" ") 但这是一个相当丑

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

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

我试了一下:

scan("foo.txt", what="character", sep=NULL)
但这仍然返回了一个向量。我在某种程度上利用了:

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

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

我将使用以下方法。它应该工作得很好,至少对我来说,看起来并不难看:

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

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

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

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

请注意,readChar为您指定的字节数分配空间,因此readCharfileName、.Machine$integer.max无法正常工作…

readChar没有太多灵活性,因此我将您的解决方案与readLines和paste相结合

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

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

如果3年后有人还在看这个问题,Hadley Wickham的readr软件包有一个方便的read_文件函数,可以为您完成这一任务

# you only need to do this one time on your system
install.packages("readr")

可惜沙龙的解决方案不能再使用了。我已将Josh O'Brien的解决方案和asieira的修改添加到我的.Rprofile文件中:

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

并像这样使用:txt=read.text'path/to/my/file.txt'。我无法复制bumpkin 10月28日14日的发现,WriteLinesText显示了file.txt的内容。另外,在writeText,“/tmp/out”之后,命令diff/tmp/out path/to/my/file.txt报告没有差异。

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

看来您的解决方案并不难看。您可以使用函数,并通过以下方式使其专业化

第一条路 第二条路
值得指出的是,此代码不适用于压缩文件。在这种情况下,file.infofilename$size返回的字节数将与将在内存中读取的实际内容不匹配,我们预计会更大。我希望collapse=\n复制原始文件上这些是独立行的事实。有了这个改变,这个解决方案将同样适用于压缩文件和未压缩文件。这似乎不起作用。如果我写的是SingleString,我会得到一个损坏的文件…如果最后一行不包含行尾字符,这将不起作用。在这种情况下,最后一行不包含在字符串中,或者,文件在最后一行中断时被截断。这对于读取文本文件非常有效,如OP的queston:text-file connections are blocking=TRUE默认情况下,因此readLines将返回完整文件,并警告丢失的EOL字符。然而@gvrocha的评论值得注意:了解你的连接类型?readLines帮助说明,如果最后一行不完整,没有最终的EOL标记,则行为取决于连接是否阻塞。对于非阻塞文本模式连接,不完整的行被静默地推回**对于所有其他连接,该行将被接受,并带有警告。**Alas read_文件现在不显示在stringr中:@mlk它已迁移到readr。我已经相应地更新了答案-我希望莎伦不介意。很好!还解压缩了flyI Get上的.gz文件。在这个codereadr::read_文件上找不到函数pase,现在很好地解决了这个问题。这并没有给提供的答案添加任何内容。在函数环境中提供路径是非常糟糕的解决方案。这个1e6大小是readChar fun限制还是R内存限制?感谢you@Tom阿斯那瓦罗:两者都不是,这是对文件中有多少字节的高估。接受的答案使用file.info获取文件中的实际字节数。
install.packages("readr") # you only need to do this one time on your system
library(readr)
mystring <- read_file("path/to/myfile.txt")
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()