Sử dụng R để tải xuống tệp dữ liệu nén, giải nén và nhập dữ liệu


122

@EZGraphs trên Twitter viết: "Rất nhiều csv trực tuyến đã được nén. Có cách nào để tải xuống, giải nén kho lưu trữ và tải dữ liệu vào data.frame bằng R? #Rstats"

Tôi cũng đã cố gắng thực hiện việc này hôm nay, nhưng cuối cùng chỉ tải xuống tệp zip theo cách thủ công.

Tôi đã thử một cái gì đó như:

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

nhưng tôi cảm thấy như thể tôi còn lâu mới đi được. Có suy nghĩ gì không?


Nó đã hoạt động? Nếu vậy, tại sao bạn vẫn cảm thấy mình còn lâu mới đi được?
FrustratedWithFormsDesigner

@ Bực bội ... Không. mã trong câu hỏi của tôi không hoạt động. Xem câu trả lời bên dưới.
Jeromy Anglim

Câu trả lời:


176

Lưu trữ zip thực sự là một 'hệ thống tệp' với siêu dữ liệu nội dung, v.v. Xem help(unzip)để biết chi tiết. Vì vậy, để làm những gì bạn phác thảo ở trên, bạn cần

  1. Tạo nhiệt độ. tên tệp (ví dụ tempfile())
  2. Sử dụng download.file()để tìm nạp tệp vào tạm thời. tập tin
  3. Sử dụng unz()để trích xuất tệp đích từ tạm thời. tập tin
  4. Xóa tệp tạm thời qua unlink()

mà trong mã (cảm ơn ví dụ cơ bản, nhưng điều này đơn giản hơn) trông giống như

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

Các tệp nén ( .z) hoặc gzipped ( .gz) hoặc bzip2ed ( .bz2) chỉ là tệp và những tệp bạn có thể đọc trực tiếp từ kết nối. Vì vậy, hãy yêu cầu nhà cung cấp dữ liệu sử dụng thay thế :)


Dirk, bạn có phiền mở rộng về cách trích xuất dữ liệu từ .zkho lưu trữ không? Tôi có thể đọc từ kết nối url với readBin(url(x, "rb"), 'raw', 99999999), nhưng làm cách nào để trích xuất dữ liệu được chứa? Các uncompressgói đã bị xóa khỏi Cran - là điều này có thể có trong cơ sở R (và nếu như vậy, là nó giới hạn ở hệ thống * nix?)? Vui lòng đăng dưới dạng một câu hỏi mới nếu thích hợp.
jbaums

3
Thấy chưa help(gzfile)- Tôi đã nghĩ rằng giờ đây giao thức gzip cũng có thể giải nén các tệp .z (cũ kỹ) vì bằng sáng chế đã hết hạn từ lâu. Nó có thể không. Ai sử dụng .z luôn? Những năm 1980 được gọi là, họ muốn trở lại của họ nén ;-)
Dirk Eddelbuettel

Cảm ơn - Tôi không thể làm cho nó hoạt động, vì vậy có lẽ nó không được hỗ trợ. Cục Khí tượng Úc cung cấp một số dữ liệu của họ dưới dạng .z, rất tiếc!
jbaums

FYI Nó không hoạt động với readRDS()(ít nhất là đối với tôi). Từ những gì tôi có thể nói, tệp cần phải thuộc loại tệp mà bạn có thể đọc được read.table().
jessi

1
bạn cũng sẽ muốn đóng kết nối. R chỉ có thể có 125 mở cùng một lúc. Một cái gì đó như con <- unz (temp, "a1.dat"); data <- read.table (con); đóng (con);
pdb

28

Chỉ để ghi lại, tôi đã thử dịch câu trả lời của Dirk thành mã :-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
Không sử dụng scan(); bạn có thể sử dụng read.table()et al trực tiếp trên một kết nối. Xem câu trả lời đã chỉnh sửa của tôi,
Dirk Eddelbuettel


9

Đối với Mac (và tôi giả sử Linux) ...

Nếu kho lưu trữ zip chứa một tệp duy nhất, bạn có thể sử dụng lệnh bash funzip, được kết hợp freadtừ data.tablegói:

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

Trong trường hợp kho lưu trữ chứa nhiều tệp, bạn có thể sử dụng tarthay thế để giải nén một tệp cụ thể sang stdout:

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

khi tôi đã cố gắng giải pháp của bạn cho nhiều tác phẩm, tôi nhận được một lỗi màFile is empty:
bshelt141

9

Đây là một ví dụ hoạt động cho các tệp không thể đọc được bằng read.tablehàm. Ví dụ này đọc tệp .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

Để thực hiện việc này bằng cách sử dụng data.table, tôi thấy rằng các cách sau hoạt động. Thật không may, liên kết không hoạt động nữa, vì vậy tôi đã sử dụng liên kết cho tập dữ liệu khác.

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)

Tôi biết điều này có thể xảy ra trong một dòng vì bạn có thể chuyển các tập lệnh bash sang fread, nhưng tôi không chắc chắn cách tải xuống tệp .zip, giải nén và chuyển một tệp duy nhất từ ​​đó sang fread.


4

Hãy thử mã này. Nó hoạt động cho tôi:

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

Thí dụ:

unzip(zipfile="./data/Data.zip",exdir="./data")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.