단일 문자열로 텍스트 파일 가져 오기


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

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
Alas "read_file"이 이제 stringr에 나타나지 않습니다. :( cran.r-project.org/web/packages/stringr/stringr.pdf
Michael Lloyd Lee mlk

7
@mlk로 마이그레이션되었습니다 readr. 이에 따라 답변을 업데이트했습니다. Sharon이 신경 쓰지 않기를 바랍니다.
Nick Kennedy

1
좋아! 또한 .gz 파일을 즉석에서 압축 해제
Andre Holzner

내가 가지고 could not find function "pase"이 코드에
Sashko Lykhenko에게

47

나는 다음을 사용할 것이다. 그것은 잘 작동해야하며 적어도 나에게는 추한 것처럼 보이지 않습니다.

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

15
나는 collapse="\n"이것들이 원본 파일에서 별도의 줄이라는 사실을 복제 할 것으로 기대했을 것 입니다. 이 변경으로이 솔루션 압축 파일과 압축되지 않은 파일 모두에 동일하게 작동합니다.
asieira

작동하지 않는 것 같습니다. Lines (singleString)를 쓰면 파일이 손상됩니다 ...
bumpkin

마지막 줄에 줄 끝 문자가 포함되어 있지 않으면 작동하지 않습니다. 이 경우 마지막 줄은 문자열에 포함되지 않습니다 (또는 마지막 줄 바꿈에서 파일이 잘립니다).
gvrocha

이것은 OP의 질문과 같이 텍스트 파일을 읽는 데 잘 작동합니다. 텍스트 파일 연결은 blocking=TRUE기본적으로이므로 readLines()누락 된 EOL 문자에 대한 경고와 함께 전체 파일을 반환합니다. 그러나 @gvrocha의 의견은주의를 기울일 가치가 있습니다. 연결 유형을 이해하십시오! ? readLines help saysIf 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")

패키지 stringr의 버전을 대체합니다.


5

Sharon의 솔루션을 더 이상 사용할 수 없어서 안타깝습니다. 내 .Rprofile 파일에 asieira의 수정 사항이있는 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차이가보고되지 않았습니다.


2

readChar는 유연성이별로 없으므로 솔루션 (readLines 및 paste)을 결합했습니다.

또한 각 줄 사이에 공백을 추가했습니다.

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.