Загрузка файла CDB в R - Ошибка в cdbunpack (readBin (zz, «raw», n = 4, size = 1, подписано = FALSE)): длина не указана 4 - PullRequest
0 голосов
/ 24 января 2020

Я использую пакет cdb, чтобы попытаться загрузить файл cdb в R. При его использовании я получаю следующее сообщение об ошибке. Кто-нибудь знает, почему это может быть или как я могу решить это? Или есть альтернативный способ загрузки файла CDB в R?

df <- read.cdb(file.choose(), type = 'cdb')

Error in cdbunpack(readBin(zz, "raw", n = 4, size = 1, signed = FALSE)) : No length 4

Это оригинальный код функции read.cdb. Я поменял место, где я получил сообщение об ошибке "ЗДЕСЬ !!!" на строке 8. Что я могу изменить здесь, чтобы сделать эту работу?

read.cdb <- function(file, type=c("cdb","txt")) {
  data <- data.frame(key=as.character(NULL), value=as.character(NULL))
if(type[1] == "cdb" ) {
cdbunpack <- function( buffer ) {
  if( class(buffer) != "raw")
    stop("Not raw data")
  if( length(buffer) != 4)
    stop("HERE!!!")
  require("bitops")
  n <- buffer[4]
  n <- bitShiftL(n, 8)
  n <- bitOr(n, buffer[3])
  n <- bitShiftL(n, 8)
  n <- bitOr(n, buffer[2])
  n <- bitShiftL(n, 8)
  n <- bitOr(n, buffer[1])
  n
}
zz <- file(file,"rb")
pointerend <- cdbunpack(readBin(zz, "raw", n=4, size= 1, signed = FALSE))
dummy <- readChar(zz, 2048 - 4, useBytes = TRUE)
pos <- 2048
data <- data.frame(key=as.character(NULL), value=as.character(NULL))
while( pos < pointerend ) {
  klen <- cdbunpack(readBin(zz, "raw", n=4, size= 1, signed = FALSE))
  vlen <- cdbunpack(readBin(zz, "raw", n=4, size= 1, signed = FALSE))
  key <-  readChar(zz,klen, useBytes = TRUE)
  value <- readChar(zz,vlen, useBytes = TRUE)
  pos <- pos + 8 + klen + vlen
  data <- rbind(data, cbind(key,value))
}
close(zz)
} else {
readalineofcdbtxtformat <- function(zz) {
  dummy <-  readChar(zz,1) # Read the "+"
  if(length(dummy)!=1 | dummy != "+" )
    return(NULL)
  klenstring <- ""
  while( (z <- readChar(zz,1,useBytes=TRUE)) != ",") {
    klenstring <- paste(klenstring,z,sep="")}
  vlenstring <- ""
  while( (z <- readChar(zz,1,useBytes=TRUE)) != ":") {
    vlenstring <- paste(vlenstring,z,sep="")}
  key <- readChar(zz,strtoi(klenstring),useBytes=TRUE)
  dummy <- readChar(zz,2) # Read the "->"
  value <- readChar(zz,strtoi(vlenstring),useBytes=TRUE)
  dummy <- readChar(zz,1) # Read the "\n"
  if( strtoi(klenstring) != nchar(key, type = "bytes") |
     strtoi(vlenstring) != nchar(value, type = "bytes") )
    stop("Error in length of key or value!")
  cbind(key,value)
}
zz <- file(file,"r")
if(!isOpen(zz))
  stop(paste("File ", file, " does not exist"))
while( length(register <- readalineofcdbtxtformat(zz)) == 2 ) {
  data <- rbind(data, register)
}
close(zz)
}
data
}
...