R: чтение двоичного файла в архиве - PullRequest
7 голосов
/ 27 мая 2011

Я пытаюсь проанализировать некоторые онлайн-данные о погоде с помощью R. Эти данные представляют собой двоичный файл, который был разархивирован. Пример файла:

ftp://ftp.cpc.ncep.noaa.gov/precip/CPC_UNI_PRCP/GAUGE_GLB/V1.0/2005/PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.20050101.gz

Если я скачаю файл на свой компьютер и вручную разархивирую его, я легко могу сделать следующее:

  myFile <- ( "/tmp/PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.20050101" )
  to.read = file( myFile, "rb")
  myPoints <- readBin(to.read, real(), n=1e6, size = 4, endian = "little")

Я бы предпочел автоматизировать загрузку / распаковку и чтение. Поэтому я подумал, что это будет так просто:

p <- gzcon( url( "ftp://ftp.cpc.ncep.noaa.gov/precip/CPC_UNI_PRCP/GAUGE_GLB/V1.0/2005/PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.20050101.gz" ) )
myPoints <- readBin(p, real(), n=1e6, size = 4, endian = "little")

Кажется, это работает просто великолепно, но на шаге вручную вектор myPoints имеет длину 518400, что точно. Однако, если R обрабатывает загрузку и чтение, как во втором примере, я получаю вектор разной длины каждый раз, когда запускаю код. Шутки в сторону. Я ничего не курю. Я клянусь. Я запускаю его несколько раз, и каждый раз вектор имеет другую длину, всегда меньше ожидаемого 518400.

Я также пытался заставить R загрузить файл gzip, используя следующее:

temp <- tempfile()
myFile <- download.file("ftp://ftp.cpc.ncep.noaa.gov/precip/CPC_UNI_PRCP/GAUGE_GLB/V1.0/2005/PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.20050101.gz",temp)

Я обнаружил, что часто это возвращает предупреждение о том, что файл не соответствует ожидаемому размеру. Как следующее:

Warning message:
In download.file("ftp://ftp.cpc.ncep.noaa.gov/precip/CPC_UNI_PRCP/GAUGE_GLB/V1.0/2005/PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.20050101.gz",  :
  downloaded length 162176 != reported length 179058

Какие-нибудь советы, которые вы можете мне дать, которые могут помочь мне решить эту проблему?

-J

1 Ответ

2 голосов
/ 27 мая 2011

Попробуйте это:

R> remfname <- "ftp://ftp.cpc.ncep.noaa.gov/precip/CPC_UNI_PRCP/GAUGE_GLB/V1.0/2005/PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.20050101.gz"
R> locfname <- "/tmp/data.gz"
R> download.file(remfname, locfname)
trying URL 'ftp://ftp.cpc.ncep.noaa.gov/precip/CPC_UNI_PRCP/GAUGE_GLB/V1.0/2005/PRCP_CU_GAUGE_V1.0GLB_0.50deg.lnx.20050101.gz'
ftp data connection made, file length 179058 bytes
opened URL
==================================================
downloaded 174 Kb

R> con <- gzcon(file(locfname, "rb"))
R> myPoints <- readBin(con, real(), n=1e6, size = 4, endian = "little")
R> close(con)
R> str(myPoints)
 num [1:518400] 0 0 0 0 0 0 0 0 0 0 ...
R> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...