nvkv
Котаны, срочно нужен стикерпак с гоферами
nvkv
есть такой?
bunin
nvkv
Круто было бы в рисовке Рене Френч, конечно :)
nvkv
но так тоже ничего, спасибо :)
engelbart
Слушайте, у меня тут задача туповатая. Но уверен вы знаете как. мне досталась база данных большая с каким то хламом внутри. Похоже на результат работы какого то сериализатора php как мне подсказали a:4:{i:0;a:2:{s:5:"text1";s:5:"asewa";s:5:"asdfe"; не знаете способа распарсить это в go struct?
Constantine️
:D
Stanislav
так и есть
engelbart
Я нагуглил wulijun/go-php-serialize но оно не опнятное куда там коней то запрягать
Stanislav
самому интересно как распарсить
Stanislav
если только руками писать парсер...
Constantine️
exec.Command(fmt.Sprintf("php -r "echo unserialize('%s')", script))
Constantine️
решение в лоб :D
Stanislav
:D
Constantine️
хотя там не echo надо, var_export
Constantine️
збсь будет
engelbart
https://godoc.org/github.com/wulijun/go-php-serialize/phpserialize похоже к этому ещё как то надо сверху велосипед писать, в цикле GetMembers
engelbart
exec.Command(fmt.Sprintf("php -r "echo unserialize('%s')", script))
У меня 500 тысяч строк, наверное другое надо искать решение
Constantine️
горутины и нормас
Constantine️
въеби систему
engelbart
печаль какая
engelbart
другой вопрос, больше про golang, я ведь в рантайме уже тип не создам нужный, так ведь?
engelbart
Хотя, что я грешу то на ту либу, увидел тока что что, она вплоне себе работает. Какой то map на выходе получаю
engelbart
Хотя нашел в ней баг, она не понимает что s:2:"ой" юникодная, и два байта выделять ей мало
engelbart
Как сказать сколько весит в байтах юникодная строка?
engelbart
https://github.com/korjavin/go-php-serialize/blob/master/decoder.go#L136 вот тут ошибка, оно выделяет в байтах считая что длина строкив символах равно длине строки в байтах
Евгений
fmt.Println(len("строка!")) 13
Евгений
в байтах
engelbart
красиво ;) Тока у меня самой строки ещё нет, и я плохо сформулировал
Евгений
можно "для уверенности" еще len([]byte("строка!"))
engelbart
у меня на вход поступает s:2:"zz" он декодер, видит число 2, выделяет два байта, и посылает в strings.Reader.Read этот двухбайтовый буфер, в случае zz всё ок, в случае яя катастрофа
Евгений
т.е. парсить руками это?
engelbart
как бы мне посылать туда буфер заранее нужного размера, не зная строки. Я так понимаю что никак.
engelbart
Задача я парсю php высер сериализации a:1:{i:0;a:2:{s:3:"url";s:87 вот это вот
engelbart
Взял либу, она мне строки режет, вот нашел это место
engelbart
Она ошибается что байт=символ
Евгений
либа совсем некурабельна?
Евгений
может проще подхачить этот момент? или там совсем все плхо?
engelbart
Ну гляньте плиз выше вот ссылка, строка 136
engelbart
Я не понимаю, как мне понять что s:2:"яя" на самом деле s:4:"яя"
Stanislav
ну, на самом деле внутри пхп оно идентично
Евгений
а что говорит спека php serialize? что там должна быть длина указана в байтах или в символах в кодировке utf8?
Stanislav
s - string, 2 - 2 символа
Евгений
тогда можно рками идти по строке по рунам
Евгений
и проверять: _
engelbart
Дак, парни какая мне разница что спека говоит, у меня вот база на руках где число - число символов, а в либе единственной что смог найти это число байт.
Евгений
- мы на наступлии на двойную кавычку " - следующий символ после конца найше строки - она
engelbart
я думаю просто идти по рунам и ждать кавычку, так?
Евгений
да
Евгений
и проверить что ее не было в середине
engelbart
\" валидная строка
engelbart
"\""
Евгений
я бы падал в обеих ситуациях - т.к. гарантированно получишь хлам
Евгений
кстати, да - еще эскейп надо отработать!
engelbart
Полное дерьмо
engelbart
ТАк, смотрите, я точно знаю, что у меня кирилица и латиница, без корейских алфавитов, т.е. в наихудшем случае два байта
engelbart
хотя. никак не помогает же это.
engelbart
s:21:"This is \"Спарта!\""
Евгений
без разницы
Евгений
они могут быть смешаны
Евгений
лучше обрабатывать общий случай
engelbart
ну получается что число в s:21 мне совсем бесполезно чтоль.
Евгений
golang-овская utf8 либа нормально отрабатывает все эти случаи с длиной
Евгений
полезно для проверки
engelbart
тут вся идея то я так понимаю, не искать кавычку, а сразу знать сколько символов
engelbart
s:15:"Низкое качество"
Евгений
что строка не оборваалсь раньше, и закончилась в нужном месте
Евгений
если идешь по рунам, то ты их проверяшь на кавычку
engelbart
func (r *Reader) Read(b []byte) (n int, err error) тут вот про байты, а есть такой же про руны ;)
engelbart
i:=21; for v,r=range str { ... i--} так идти?
Евгений
грубо говря так
Евгений
https://play.golang.org/p/yRUZVuHaFR
Евгений
const nihongo = "日本語 \"Вася" for index, runeValue := range nihongo { fmt.Printf("%#U starts at byte position %d", runeValue, index) if runeValue == '"' { fmt.Printf(" <-- Achtung! Кавычка ") } fmt.Printf("\n") }
Евгений
в доке более подробно
Евгений
https://blog.golang.org/strings
engelbart
да, спасибо это я понял. Тут конечно попандос с экранированием
Евгений
да
engelbart
хотя, я ж могу опираться на число символов
Евгений
ну это можно решить флагом
engelbart
прочитать по рунам все 21, убедится что последняя кавычка