ใช้ R เพื่อดาวน์โหลดไฟล์ข้อมูลที่บีบอัดแยกและนำเข้าข้อมูล


122

@EZGraphs บน Twitter เขียนว่า "csvs ออนไลน์จำนวนมากถูกบีบอัดมีวิธีดาวน์โหลดคลายซิปไฟล์ที่เก็บถาวรและโหลดข้อมูลลงใน data.frame โดยใช้ R หรือไม่ #Rstats"

วันนี้ฉันก็พยายามทำเช่นกัน แต่สุดท้ายก็แค่ดาวน์โหลดไฟล์ zip ด้วยตนเอง

ฉันลองทำสิ่งที่ชอบ:

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

แต่ฉันรู้สึกราวกับว่าฉันอยู่ห่างไกล ความคิดใด ๆ ?


ได้ผลหรือไม่? ถ้าเป็นเช่นนั้นทำไมคุณถึงยังรู้สึกว่าคุณอยู่ไกล?
FrustratedWithFormsDesigner

@ ไว้ใจ ... รหัสในคำถามของฉันใช้ไม่ได้ ดูคำตอบด้านล่าง
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) หรือ gzipped ( .gz) หรือ bzip2ed ( .bz2) เป็นเพียงไฟล์และไฟล์ที่คุณสามารถอ่านได้โดยตรงจากการเชื่อมต่อ ดังนั้นรับผู้ให้บริการข้อมูลเพื่อใช้แทน :)


Dirk คุณคิดจะขยายเกี่ยวกับวิธีการดึงข้อมูลจากที่.zเก็บถาวรหรือไม่? ฉันอ่านได้จากการเชื่อมต่อ url readBin(url(x, "rb"), 'raw', 99999999)แต่ฉันจะดึงข้อมูลที่มีอยู่ได้อย่างไร uncompressแพคเกจถูกลบออกจาก CRAN - เป็นไปได้ในฐาน R (และถ้าเป็นเช่นนั้นมัน จำกัด ให้ระบบระวัง *?)? ยินดีที่จะโพสต์เป็นคำถามใหม่หากเหมาะสม
jbaums

3
ดูhelp(gzfile)- ฉันคิดว่าตอนนี้โปรโตคอล gzip อาจคลายการบีบอัดไฟล์. z (หินเก่า) ด้วยเพราะสิทธิบัตรหมดอายุไปนานแล้ว มันอาจจะไม่ ใครใช้. z บ้าง เรียกว่ายุค 80 พวกเขาต้องการการบีบอัดของพวกเขากลับมา ;-)
Dirk Eddelbuettel

ขอบคุณ - ฉันไม่สามารถใช้งานได้ดังนั้นอาจไม่ได้รับการสนับสนุนในภายหลัง สำนักอุตุนิยมวิทยาออสเตรเลียให้ข้อมูลบางส่วนเป็น. z แต่น่าเสียดาย!
jbaums

FYI มันใช้ไม่ได้กับreadRDS()(อย่างน้อยสำหรับฉัน) จากสิ่งที่ฉันบอกได้ไฟล์ต้องอยู่ในประเภทไฟล์ที่คุณสามารถอ่านread.table()ได้
jessi

1
คุณจะต้องปิดการเชื่อมต่อด้วย R สามารถเปิดได้ 125 ครั้งเท่านั้น บางอย่างเช่น con <- unz (temp, "a1.dat"); ข้อมูล <- read.table (con); ปิด (Con);
pdb

28

สำหรับบันทึกฉันพยายามแปลคำตอบของ Dirk เป็นรหัส :-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 โดยตรงกับการเชื่อมต่อ ดูคำตอบที่แก้ไขของฉัน
Dirk Eddelbuettel

17

ผมใช้ CRAN แพคเกจ "ดาวน์โหลด" พบที่http://cran.r-project.org/web/packages/downloader/index.html ง่ายกว่ามาก.

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

2
ฉันเพิ่งใช้ utils :: unzip ไม่จำเป็นต้องใช้แพ็คเกจ downlaoder สำหรับฉัน
mtelesha

ณ ปี 2019 - ฉันต้องพูดว่า exdir = '.'
userJT

9

สำหรับ Mac (และฉันคิดว่าเป็น Linux) ...

หากไฟล์ zip มีไฟล์เดียวคุณสามารถใช้คำสั่ง 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 scripts ไปfreadได้ แต่ฉันไม่แน่ใจว่าจะดาวน์โหลดไฟล์. zip, แตกไฟล์และส่งไฟล์เดียวจากไฟล์นั้นไปยังไฟล์fread.


4

ลองใช้รหัสนี้ มันใช้ได้กับฉัน:

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

ตัวอย่าง:

unzip(zipfile="./data/Data.zip",exdir="./data")

0

ฉันพบว่าสิ่งต่อไปนี้ใช้ได้ผลกับฉัน ขั้นตอนเหล่านี้มาจากวิดีโอ YouTube ของ BTD การจัดการ Zipfile ใน R :

zip.url <- "url_address.zip"

dir <- getwd()

zip.file <- "file_name.zip"

zip.combine <- as.character(paste(dir, zip.file, sep = "/"))

download.file(zip.url, destfile = zip.combine)

unzip(zip.file)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.