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


204

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

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

Я попробовал это с:

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

но это все равно вернуло вектор. Я получил это работает с:

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

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


20
readr::read_fileтеперь решает эту проблему красиво.
Зак

Ответы:


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 года спустя, в пакете 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
Майкл Ллойд Ли mlk

8
@mlk это было перенесено в readr. Я обновил ответ соответственно - надеюсь, Шарон не против.
Ник Кеннеди

2
отлично ! также распаковывает файлы .gz на лету
Андре Хольцнер,

Я попал could not find function "pase"по этому коду
Сашка Лыхенко

47

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

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

15
Я ожидал collapse="\n"бы повторить тот факт, что это отдельные строки в исходном файле. С этим изменением это решение будет одинаково хорошо работать для сжатых и несжатых файлов.
asieira

Это не похоже на работу. Если я пишу строки (singleString), я получаю поврежденный файл ...
bumpkin

Это не работает, если последняя строка не содержит символа конца строки. В этом случае последняя строка не включается в строку (альтернативно, файл усекается при разрыве последней строки).
gvrocha

Это будет хорошо работать для чтения текстовых файлов, как в задании OP: подключения blocking=TRUEк текстовым файлам по умолчанию, поэтому readLines()вернет полный файл только с предупреждением о пропущенном символе EOL. Однако комментарий @ gvrocha заслуживает внимания: поймите, какой у вас тип подключения! 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")

Это заменяет версию в пакете stringr.


5

Жаль, что решение Шарона больше нельзя использовать. Я добавил решение Джоша О'Брайена с модификацией 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сообщалось о различиях.


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 . Обеспечение пути в функциональной среде является особенно плохим решением.
Конрад
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.