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