Десериализация php объектов с помощью R
Сериализация объектов - сохранение объектов между сессиями, В PHP это строковое представление любого значения, которое может быть сохранено. Выглядит сериализованный на PHP объект примерно так: a:1:{s:17:\"last_cart_refresh\";i:1470188219;}. Чем то напоминает json, но распарсить на R такое представление объекта достаточно сложно.
С проблемой десериализации php объектов на R я столкнулся, когда в таком виде объекты записывались в базу данных. А моей задачей было развернуть эти данные на R.
Никаких встроенных механизмов на R реализующих десериализацию PHP объектов нет, так же нет и пакета, который это делал.
Тогда я просто с помощью регулярного выражения вытянул нужные мне данные из сериализованных объектов, но как оказалось на Stackowerflow есть готовое решение.
Функция представленная ниже написана на базовом R, она принимает строку, которой является сериализованый PHP объект, разворачивает его и возвращает матрицу:
<- function(string){
first <- unlist(strsplit(string, "\\{|\\}", fixed=F))
inside_array <- unlist(strsplit(first[-1], ";", fixed=T))
infomation_type <- substr(inside_array, 1,1)
if(any(nchar(gsub("s|i", "", unique(infomation_type) )) != 0)){
stop("unknow datatype in serilize data")
}
inside_array_s <- rep(NA, length(inside_array))
pos <- infomation_type == "s"
string_length <- as.numeric(sapply(strsplit(inside_array, ":", fixed=T), function(x) x[2]))[pos]
inside_array_s[pos] <- substr(inside_array[pos], nchar(string_length)+4, nchar(inside_array[pos]))
pos <- infomation_type == "i"
inside_array_s[pos] <- substr(inside_array[pos],3,nchar(inside_array[pos]))
# create key and value for each elment
key <- inside_array_s[seq(1,length(inside_array_s),2)]
value <- inside_array_s[seq(2,length(inside_array_s),2)]
return(cbind(key, value))
}
Результат:
string <- 'a:1:{s:17:\"last_cart_refresh\";s:17:\"last_cart_refresh\";}'
php_unserialize(string)
key value
[1,] "\"last_cart_refresh\"" "\"last_cart_refresh\""
Там же есть более продвинутый вариант этой функции, который возвращает не матрицу, а список.
Ссылки:
- Ответ на Stackowerflof
#заметки_по_R