�H
0e5f0cb6-4b3a-11e4-ab6d-00505680132919284
Острійки
H
bfdfaab5-74ce-4e4c-97ef-c4ef3cccc8ca
H
e4ab1570-4b33-11e4-ab6d-005056801329
H
563ced13-f210-11e3-8c4a-0050568002cf$
49.812388000000000$30.315688000000000
H
855e5498-5445-11ed-a361-48df37b92096
H
00000000-0000-0000-0000-000000000000
как видим данные читаются есть название населенного пункта(Острійки), есть координаты(49.812388000000000$30.315688000000000), и какие то GUID все это разделено символом "H"
Вопрос как заставить платформу прочитать эти данные в более нормальном(читабельном) виде?
в данном случаи было несколько ошибок постараюсь кратко описать
1. формат при создании подписчика binary работал по первоначально переданной ссылке, а для работы с avro надо было использовать ссылку которая возвращается при при создании подписчика
2. при получении данных надо передать в заголовках
Accept application/vnd.kafka.avro.v2+json
Content-Type application/vnd.kafka.avro.v2+json
после этих исправлений удалось данные корректно получить в json
всем спасибо кто принимал участие
Вопрос как заставить платформу прочитать эти данные в более нормальном(читабельном) виде?
А платформа об этом знает? Сомневаюсь.
А гуиды вполне возможно идентификаторы самой системы кафки. Посмотрите документацию. Возможно по ним можно получить подробное описание.
Ну и соответственно составлять таблицу соответствий этих гуид и своих объектов в базе.
не дает покоя что key что value начинаются с ААААА
Это нулевые байты.
Один символ Base64 кодирует 6 бит данных. "A" это по сути 000000 в двоичной системе.
Символы64: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
это решение я понимаю, вижу риски тут если
в начале какие то непонятные байты "�H
если в какой то момент разделителем "станет" другой символ, или этот символ попадет в значения вложениях данных СтрРазделить вернет не верные данные
Ну, это просто - первый элемент массива отбрасываем, в нем будет только "�"
если в какой то момент разделителем "станет" другой символ
Тогда надо будет генерировать сообщение об ошибке вида "Пригласите программиста!". :-)
ИМХО, в программировании не надо пытаться предусмотреть то, чего нет и, возможно, никогда не будет, надо писать программу для тех условий, что есть сейчас.
или этот символ попадет в значения вложениях данных
А вот это теоретически возможно. Но не в GUID, их формат определен, а в название населенного пункта - если оно будет начинаться с большой латинской "H". Может ли такое быть в вашей задаче - я не знаю.
с большой латинской "H". Может ли такое быть в вашей задаче - я не знаю.
в том то и дело что может это ж только маленький пример для теста, там около 80+ topic по 5 из которых планируется интеграция а дальше если взлетит больше
(16)Ну не используйте СтрРазделить.
Элементарная же обработка - берете первую строку, какой в ней символ есть, тот и разделитель.
Дальше просто в цикле построчно читаете данные.
Если строка формата ГУИДа, это ГУИД, иначе это координаты или название пункта.
В чем у вас сложность, не понимаю.
в том то и дело что может это ж только маленький пример для теста
А, кстати, вы этот пример привели as is, или отредактировали?
То есть, декодированные данные исходно содержат символы перевода строки или это вы их туда добавили для удобства чтения?
Если содержит, то можно разделять строку в массив по Символы.ПС, а дальше в цикле проверять элементы массива:
1. Если СтрДлина(ЭлементМассива)<=2 (на всякий случай) - это разделитель (любой символ!), пропускаем.
2. Если Сред(ЭлементМассива,9)="-" И Сред(ЭлементМассива,14)="-" И Сред(ЭлементМассива,19)="-" И Сред(ЭлементМассива,24)="-" и Найти(ЭлементМассива,"$")>0 - это GUID+координаты, разлагаем элемент по "$"
3. Если Сред(ЭлементМассива,9)="-" И Сред(ЭлементМассива,14)="-" ИСред(ЭлементМассива,19)="-" ИСред(ЭлементМассива,24)="-" - это GUID.
4. Иначе - это населенный пункт.
Жаль. Ну, тогда вам отличную идею подал Sashares: перебираем строку посимвольно, как только нашли символ с кодом в диапазоне от 48 до 255 - это разделитель, по нему разлагаем в массив.
Это (�) вполне может быть байт указания символа разделителя. В данном случае символом указан H.
Т.е. вполне можно узнать символ разделитель и разделить по нему.
пока нет, жду
это огромная структура, даже не дают контакты человека с которым можно поговорить, все через менеджеров как с их так и с нашей стороны, ничего нового, как всегда 1с копает
Вот такой мой вариант. Ищем все GUID в строке. Все найденные GUID сохраняем в массиве.
Далее уже от них ищем индекс и город.
Широту и долготу по ищем по "$"
СтроковыеФункцииКлиентСервер.ЭтоУникальныйИдентификатор это БСП функция. Показывать здесь её не буду, сможете посмотреть у себя.
ДекодированнаяСтрока = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(Base64Text));
МассивGUID = Новый Массив;
Для Индекс = 1 По СтрДлина(ДекодированнаяСтрока) Цикл
GUID = Сред(ДекодированнаяСтрока, Индекс, 36);
Если СтроковыеФункцииКлиентСервер.ЭтоУникальныйИдентификатор(GUID) Тогда
МассивGUID.Добавить(GUID);
КонецЕсли;
КонецЦикла;
Если МассивGUID.Количество() > 0 Тогда
ПозицияГородаСИндексомНачало = СтрНайти(ДекодированнаяСтрока, МассивGUID[0])+36;
ПозицияГородаСИндексомКонец = СтрНайти(ДекодированнаяСтрока, МассивGUID[1])-1;
ИндексИГород = СокрЛП(Сред(ДекодированнаяСтрока, ПозицияГородаСИндексомНачало, ПозицияГородаСИндексомКонец-ПозицияГородаСИндексомНачало));
КонецЕсли;
ПозицияШирота = СтрНайти(ДекодированнаяСтрока, "$")+1;
ПозицияДолгота = СтрНайти(ДекодированнаяСтрока, "$",,ПозицияШирота)+1;
Широта = Сред(ДекодированнаяСтрока, ПозицияШирота, 18);
Долгота = Сред(ДекодированнаяСтрока, ПозицияДолгота, 18);
(28) спасибо за Ваш алгоритм, вчера презентовал что то подобное на дейли, где присутствовал и архитектор.
приняли решение что схема рабочая, но пока будем искать другое решение
отправили запрос в компанию вледелец сервиса, посмотрим что ответят
Даже интересно - чем не устраивает ни одно из предложенных? Тем, что "однажды внезапно все может поменяться"? Ну, тогда для решения задачи нужен ИИ (искусственный интеллект), который будет понимать содержимое строки.
Или волшебное заклинание: "Сим-салабим-ахалай-махалай!" - и строка сама разложилась так, как нужно!
Кроме сложностей с практической реализацией этих двух методов есть еще один маааленький нюанс: оба стоят несколько больше, чем 10 $m. ;-)
конечно если искать решение то так, я писал вопрос в надежде что у кого то уже был подобный опыт с кафкой, и когда найду решение обязательно его тут опубликую
как написал user5300 тут надо ещё понять что отдающая сторона ложит в бейс64, что бы корректно прочитать
жду ответа от владельца сервиса
в данном случаи было несколько ошибок постараюсь кратко описать
1. формат при создании подписчика binary работал по первоначально переданной ссылке, а для работы с avro надо было использовать ссылку которая возвращается при при создании подписчика
2. при получении данных надо передать в заголовках
Accept application/vnd.kafka.avro.v2+json
Content-Type application/vnd.kafka.avro.v2+json
после этих исправлений удалось данные корректно получить в json
всем спасибо кто принимал участие