テキストファイルを単一の文字列としてインポートする


204

Rでプレーンテキストファイルを単一の文字列としてどのようにインポートしますか?これはおそらく非常に単純な答えになると思いますが、今日これを試したところ、これを行う機能が見つからないことに気付きました。

たとえば、foo.txtテキストマイニングしたいものを含むファイルがあるとします。

私はそれを試しました:

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

しかし、これはまだベクトルを返しました。私はそれをいくらか使っています:

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

しかし、それは恐らく不安定でもあるかなり醜い解決策です。


20
readr::read_fileこの問題を今すぐうまく解決します。
Zach

回答:


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年後にこの質問を見ている、ハドレーウィッカムの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
残念ながら、「read_file」は現在、ストリンガーに表示されません。:( cran.r-project.org/web/packages/stringr/stringr.pdf
マイケルロイドリーmlk

7
@mlkに移行されましたreadr。私はそれに応じて答えを更新しました-私はシャロンが気にしないことを望みます。
Nick Kennedy

1
いいね!また、オンザフライで.gzファイルを解凍します
Andre Holzner '14 / 04/16

私はcould not find function "pase"このコードに乗った
Sashko Lykhenko 2017

47

以下を使用します。それはうまくいくはずで、少なくとも私には醜くはありません:

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

15
collapse="\n"これらが元のファイルの別々の行であるという事実を再現することを期待していました。この変更により、このソリューション圧縮ファイルと非圧縮ファイルのどちらでも同じように機能します。
asieira 2014年

これは機能していないようです。Lines(singleString)を書き込むと、ファイルが破損します...
バンプキン

最後の行に行末文字が含まれていない場合、これは機能しません。その場合、最後の行は文字列に含まれません(または、ファイルは最後の改行で切り捨てられます)。
gvrocha 2018年

これは、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

readrパッケージはあなたのためにすべてを行う機能を持っています。

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

これにより、パッケージストリンガーのバージョンが置き換えられます。


5

シャロンのソリューションがもう使えないのは残念です。.Rprofileファイルにasieiraを変更したJosh O'Brienのソリューションを追加しました。

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が提供する回答に何も追加しません。関数環境内でパスを提供することは、特に貧弱なソリューションです。
Konrad、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.