Импортировать текстовый файл как строку символов

151

Как вы импортируете простой текстовый файл в виде отдельной символьной строки в R? Я думаю, что это, вероятно, будет очень простым ответом, но когда я пробовал это сегодня, я обнаружил, что не могу найти функцию для этого.

Например, предположим, что у меня есть файл foo.txt с чем-то, что я хочу textmine.

Я попробовал:

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

но это все равно возвращает вектор. Я немного работал с ним:

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

но это довольно уродливое решение, которое, вероятно, также нестабильно.

  • 7
    readr::read_file теперь прекрасно решает эту проблему.
Теги:

7 ответов

166
Лучший ответ

Здесь вариант решения от @JoshuaUlrich, который использует правильный размер вместо жестко заданного размера:

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

Обратите внимание, что readChar выделяет пространство для количества заданных вами байтов, поэтому readChar(fileName, .Machine$integer.max) не работает хорошо...

  • 0
    +1 за то, что не ленился по поводу nchars= . :)
  • 14
    Стоит отметить, что этот код не будет работать для сжатых файлов. В этом случае число байтов, возвращаемых file.info (имя файла) $ size, не будет соответствовать фактическому содержимому, которое будет считываться в памяти, которое мы ожидаем увеличить.
88

В случае, если кто-то все еще смотрит на этот вопрос через 3 года, пакет Hadley Wickham 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" теперь не отображается в stringr. :( cran.r-project.org/web/packages/stringr/stringr.pdf
  • 4
    @mlk это было перенесено в readr . Я соответственно обновил ответ - надеюсь, Шарон не против.
Показать ещё 2 комментария
35

Я бы использовал следующее. Он должен работать нормально, и не кажется уродливым, по крайней мере для меня:

singleString <- paste(readLines("foo.txt"), collapse=" ")
  • 13
    Я ожидал, что collapse="\n" будет повторять тот факт, что это отдельные строки в исходном файле. С этим изменением это решение будет одинаково хорошо работать для сжатых и несжатых файлов.
  • 0
    Это не похоже на работу. Если я пишу линии (singleString), я получаю поврежденный файл ...
Показать ещё 2 комментария
10

Как насчет:

string <- readChar("foo.txt",nchars=1e6)
  • 2
    +1: я также добавил вариант, который использует правильный размер вместо nchars=1e6 ...
4

В пакете 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.

2

Слишком плохо, что решение Sharon больше нельзя использовать. Я добавил решение Josh O'Brien с модификацией asieira в файл .Rprofile:

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

и используйте его следующим образом: txt = read.text('path/to/my/file.txt'). Я не смог повторить поиск бамбука (28 окт 14), а writeLines(txt) показал содержимое file.txt. Кроме того, после write(txt, '/tmp/out') команда diff /tmp/out path/to/my/file.txt не сообщила о различиях.

1

readChar не имеет большой гибкости, поэтому я объединил ваши решения (readLines и paste).

Я также добавил пробел между каждой строкой:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню