Використовуючи R для завантаження файлів, що зберігаються у форматі даних, вилучення та імпорту даних


122

@EZGraphs у Twitter пише: "Багато інтернет-файлів csvs застебнуто. Чи є спосіб завантажити, розпакувати архів і завантажити дані до кадру даних за допомогою R? #Rstats"

Я також намагався це зробити сьогодні, але закінчилося просто завантаження zip-файлу вручну.

Я спробував щось на кшталт:

fileName <- "http://www.newcl.org/data/zipfiles/a1.zip"
con1 <- unz(fileName, filename="a1.dat", open = "r")

але я відчуваю себе так, ніби мені далеко. Будь-які думки?


Це спрацювало? Якщо так, то чому б ви все ще відчували, що вам далеко?
FrustratedWithFormsDesigner

@ Розчаровані ... Ні. код у моєму питанні не працює. Відповіді дивіться нижче.
Джеромі Англім

Відповіді:


176

Архів Zip - це фактично більше "файлова система" з метаданими вмісту тощо. Детальніше help(unzip)див. Отже, щоб зробити те, що ви накреслили вище, вам потрібно

  1. Створіть темп. назва файлу (наприклад tempfile())
  2. Використовуйте download.file()для отримання файлу в темп. файл
  3. Використовуйте unz()для вилучення цільового файлу з темп. файл
  4. Видаліть тимчасовий файл через unlink()

що в коді (спасибі за основний приклад, але це простіше) виглядає

temp <- tempfile()
download.file("http://www.newcl.org/data/zipfiles/a1.zip",temp)
data <- read.table(unz(temp, "a1.dat"))
unlink(temp)

Стислі ( .z) або gzipped ( .gz) або bzip2ed ( .bz2) файли - це лише той файл, який ви можете прочитати безпосередньо із з'єднання. Тож дозвольте постачальнику даних використовувати це замість цього :)


Дірк, ви б не подумали про те, як витягти дані з .zархіву? Я можу читати з URL-зв’язку readBin(url(x, "rb"), 'raw', 99999999), але як я можу витягувати містяться дані? uncompressПакет був видалений з CRAN - це можливо в базовому R (і якщо так, то вона обмежена * NIX системи?)? Раді опублікувати як нове запитання, якщо це доречно.
jbaums

3
Дивіться help(gzfile)- я думав, що протокол gzip може тепер віджатись (кам'яні старі) .z файли також тепер, коли термін дії патенту давно минув. Це не може. Хто все-таки використовує .z? 1980-ті закликали, вони хочуть їх стиснення назад ;-)
Дірк Еддельбуеттель,

Дякую - я не можу змусити його працювати, тому, можливо, він не підтримується. Австралійське бюро метеорології надає деякі свої дані як .z, на жаль!
jbaums

FYI Це не працює readRDS()(принаймні для мене). З того, що я можу сказати, файл повинен бути у вигляді файлу, який ви можете прочитати read.table().
jessi

1
ви також хочете перервати з'єднання. R може мати відразу 125 відкритих. Щось на зразок con <- unz (temp, "a1.dat"); дані <- read.table (con); закрити (кон);
pdb

28

Тільки для запису я спробував перевести відповідь Дірка в код :-P

temp <- tempfile()
download.file("http://www.newcl.org/data/zipfiles/a1.zip",temp)
con <- unz(temp, "a1.dat")
data <- matrix(scan(con),ncol=4,byrow=TRUE)
unlink(temp)

5
Не використовуйте scan(); ви можете використовувати read.table()et al безпосередньо під час з'єднання. Дивіться мою відредаговану відповідь,
Дірк Еддельбуеттель

17

Я використовував CRAN пакет "завантажувач", знайдений на веб-сайті http://cran.r-project.org/web/packages/downloader/index.html . Набагато простіше.

download(url, dest="dataset.zip", mode="wb") 
unzip ("dataset.zip", exdir = "./")

2
Я просто використовую утиліти: unzip для мене не потрібен пакет
downlaoder

станом на 2019 рік - мені довелося сказати exdir = '. "
користувачJT

9

Для Mac (і я вважаю Linux) ...

Якщо ж в архіві містить один файл, ви можете використовувати команду Баша funzip, в зв'язці з freadз data.tableпакета:

library(data.table)
dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | funzip")

У випадках, коли архів містить кілька файлів, ви можете tarзамість цього витягнути певний файл для stdout:

dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | tar -xf- --to-stdout *a1.dat")

коли я спробував ваше рішення для кількох файлів, я отримую помилку, щоFile is empty:
bshelt141

9

Ось приклад, який працює для файлів, які не можуть бути прочитані за допомогою read.tableфункції. Цей приклад читає .xls файл.

url <-"https://www1.toronto.ca/City_Of_Toronto/Information_Technology/Open_Data/Data_Sets/Assets/Files/fire_stns.zip"

temp <- tempfile()
temp2 <- tempfile()

download.file(url, temp)
unzip(zipfile = temp, exdir = temp2)
data <- read_xls(file.path(temp2, "fire station x_y.xls"))

unlink(c(temp, temp2))

5

Для цього за допомогою data.table я виявив, що працює наступне. На жаль, посилання більше не працює, тому я використав посилання для іншого набору даних.

library(data.table)
temp <- tempfile()
download.file("https://www.bls.gov/tus/special.requests/atusact_0315.zip", temp)
timeUse <- fread(unzip(temp, files = "atusact_0315.dat"))
rm(temp)

Я знаю, що це можливо в одному рядку, оскільки ви можете передавати скрипти bash fread, але я не впевнений, як завантажити .zip файл, витягнути і передати один файл з цього в fread.


4

Спробуйте цей код. Це працює для мене:

unzip(zipfile="<directory and filename>",
      exdir="<directory where the content will be extracted>")

Приклад:

unzip(zipfile="./data/Data.zip",exdir="./data")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.