R을 사용하여 압축 된 데이터 파일 다운로드, 데이터 추출 및 가져 오기


122

Twitter의 @EZGraphs는 "많은 온라인 csv가 압축되어 있습니다. R을 사용하여 아카이브를 다운로드하고 압축을 풀고 data.frame에 데이터를로드하는 방법이 있습니까? #Rstats"

오늘도이 작업을 수행하려고했지만 zip 파일을 수동으로 다운로드했습니다.

나는 다음과 같은 것을 시도했다.

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

하지만 나는 멀리 떨어져있는 것처럼 느낍니다. 이견있는 사람?


작동 했나요? 그렇다면 왜 여전히 멀리 떨어져 있다고 생각합니까?
FrustratedWithFormsDesigner

@Frustrated ... 아니. 내 질문의 코드가 작동하지 않습니다. 아래 답변을 참조하십시오.
Jeromy Anglim

답변:


176

Zip 아카이브는 실제로 콘텐츠 메타 데이터 등이있는 '파일 시스템'에 가깝습니다. 자세한 내용은를 참조 help(unzip)하십시오. 따라서 위에서 스케치 한 작업을 수행하려면

  1. 임시를 만듭니다. 파일 이름 (예를 들어 tempfile())
  2. download.file()파일을 임시로 가져 오는 데 사용 합니다. 파일
  3. unz()temp에서 대상 파일을 추출하는 데 사용 합니다. 파일
  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) 또는 gzip ( .gz) 또는 bzip2ed ( .bz2) 파일은 파일 일 뿐이며 연결에서 직접 읽을 수 있습니다. 따라서 데이터 공급자가 대신 사용하도록하십시오. :)


Dirk, .z아카이브 에서 데이터를 추출하는 방법을 확장 해 주 시겠습니까? 와의 URL 연결에서 읽을 수 readBin(url(x, "rb"), 'raw', 99999999)있지만 포함 된 데이터를 어떻게 추출합니까? uncompressCRAN에서 제거 된 패키지 -베이스 R이 가능하며 (그래서 경우 유닉스 나 시스템에 한정되는?)? 적절한 경우 새 질문으로 게시 해 드리겠습니다.
jbaums 2013

3
참조하십시오 help(gzfile)-특허가 오래 만료되었으므로 gzip 프로토콜이 (돌 오래된) .z 파일의 압축을 풀 수 있다고 생각했습니다. 그렇지 않을 수도 있습니다. 어쨌든 누가 .z를 사용합니까? 1980 년대에 전화, 그들은 압축을 다시 원합니다 ;-)
Dirk Eddelbuettel 2013

감사합니다. 작동하도록 할 수 없으므로 결국 지원되지 않을 수 있습니다. 호주 기상청은 안타깝게도 일부 데이터를 .z로 제공합니다!
jbaums 2013

참고로 readRDS()(적어도 나를 위해) 작동하지 않습니다 . 내가 알 수 있듯이 파일은 .NET으로 읽을 수있는 종류의 파일이어야 read.table()합니다.
jessi

1
또한 연결을 닫고 싶을 것입니다. R은 한 번에 125 개만 열 수 있습니다. con <-unz (temp, "a1.dat"); 데이터 <-read.table (con); 닫기 (con);
pdb

28

기록을 위해 Dirk의 답변을 코드로 번역하려고했습니다.

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을 사용할 수 있습니다 . 내 편집 대답을 참조하십시오
더크 Eddelbuettel


9

Mac의 경우 (그리고 Linux로 가정) ...

우편 아카이브가 하나의 파일이 포함되어있는 경우, 당신은 bash는 명령을 사용할 수 있습니다 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")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.