惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Full Disclosure
Recorded Future
Recorded Future
T
Tenable Blog
S
Securelist
C
CERT Recently Published Vulnerability Notes
T
Threatpost
S
Schneier on Security
A
Arctic Wolf
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
Know Your Adversary
Know Your Adversary
P
Privacy International News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Register - Security
The Register - Security
Cisco Talos Blog
Cisco Talos Blog
AWS News Blog
AWS News Blog
K
Kaspersky official blog
T
True Tiger Recordings
T
Threat Research - Cisco Blogs
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
T
The Exploit Database - CXSecurity.com
小众软件
小众软件
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Azure Blog
Microsoft Azure Blog
Cyberwarzone
Cyberwarzone
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tor Project blog
Spread Privacy
Spread Privacy
Malwarebytes
Malwarebytes
P
Proofpoint News Feed
F
Fox-IT International blog
F
Fortinet All Blogs
P
Privacy & Cybersecurity Law Blog
G
GRAHAM CLULEY
量子位
Latest news
Latest news
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
Project Zero
Project Zero
T
Tailwind CSS Blog
N
Netflix TechBlog - Medium
Martin Fowler
Martin Fowler
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
I
Intezer
博客园_首页
腾讯CDC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Darknet – Hacking Tools, Hacker News & Cyber Security

Все публикации подряд на Хабре

Nano Banana Google AI: как использовать Нано Банана для генерации и редактирования изображений Два игрока на весь российский рынок ИИ: что показал ЦИПР-2026 Менеджер ресурсов ЯНДЕКС 360 (YANDEX 360) промокоды июнь 2026: промокод Yandex 360 скидка 40% на годовые тарифы Open-Source инструмент для автоматического перевода книг Ищу ранних тестировщиков для Android-версии agent harnesses Не используйте LLM для текста Увеличиваем продажи без слез аналитика Оптимизация запросов к PostgreSQL: 5 неочевидных настроек для продакшена 45 лет тюрьмы за DROP TABLE и переход Карпатого в Anthropic Планирование движения для ровера на ходовой Ackerman'а Революция в изучении языков Java — быстрая. Ваш код может таким не быть Как я опоздал на конкурс OpenAi с новой архитектурой нейросети Быстрые интеграции в 1С: прощайте, бесконечные переделки Как получить субсидию 300 миллионов от Минпромторга? preIPO Anthropic, OpenAI, SpaceX. Разбираемся — стоит ли участвовать? Entaxy ION + OPC UA: два способа получить данные с промышленного оборудования Память на миллион, а толку ноль: как мы спасали ИИ-агента от «тупости» РСЯ, AdSense или myTarget: что на самом деле в 2026 приносит больше денег сайту и причем тут монетизаторы Практическое построение сервисов на Go под реальный трафик PostgreSQL и аналитика: что меняется, когда хранилище становится общим Codex за 5 месяцев 2026: мой топ-5 релизов, что не зашло и где OpenAI обогнал Anthropic Как создать короткое видео с помощью нейросетей: Полный гайд по Veo 3.1, Kling 3.0 и Happy Horse 1.0 Алгоритм проверок физлиц от экс сотрудника ФНС Как ИИ портит резюме студентам Системные вызовы в сфере ИТ в 2026: стратегический взгляд для ИТ-руководителей Вайбкодинг заканчивается на localhost: как я строю SaaS для цифровизации коттеджных поселков с Codex Производственные риски в небольшом кастомном производстве. С чем я сталкивалась и как научилась это учитывать Подключаем ИИ органы чувств: bash-демон, пайка и самосознание на Raspberry Pi Я хотел повторить Growing Neural CA за вечер. Ушёл месяц Промт для генерации текста без ИИ следа — как писать уникальные тексты через нейросеть От capabilities к AppArmor: что реально остановит атакующего в контейнере CactOS Вектора интересов: как находить настоящую мотивацию и усиливать команды Цена безопасности [Перевод] Цена безопасности “Рубик” от пет-проекта до прода или ITIL 4 для строительно-торговых центров Чего ждать (и не ждать) от ремейка AC4 Black Flag Архитектурный тупик корпоративного хранения: почему смена модели не снимает ограничений и что с этим делать Атаки через подрядчиков, дефицит кадров и квест с импортозамещением: главные вызовы ИБ в 2026 году Я не оставлю детям наследства Почему порты стали «дверями» в сервер, и кто решил, что SSH будет 22 Почему зарубежные разработчики чипов возвращаются на китайские фабрики Как у меня НЕ получился торговый бот на Polymarket Проектирование архитектуры в нотации ArchiMate с использованием ИИ. Часть 2 Как превратить домашнюю файлопомойку в умную AI-галерею на основе сборки из x99+Xeon и видеокарты за 2 тыс рублей Перспективы заселения нашей галактики Кризис менеджмент в ИТ Reactive Programming не спасёт вас. Если вы не решили эти 5 проблем — у вас просто медленный монолит с Flux Как я делаю DIY-контроллер для ПК: громкость, приложения, MIDI, OBS Миграция микросервисов на Python с помощью LLM: экономим месяцы для разработчиков Программирование микросхем GAL и им подобных Почему таск-трекер не заменяет ИСУП: из чего состоит полноценный контур управления проектами Всё об информационной безопасности. Кибербезопасность. DevOps, CI/CD. Хакеры. Алексей Федулаев Как импортировать базу клиентов в amoCRM и навести порядок в контактах Как мы четыре раза переписали Outbox Google предлагает единый «водяной знак» для изображений, видео и текста, созданных ИИ Сексизм в IT: данные вместо домыслов Один фронтенд, чтоб править всеми, один фронтенд, чтоб всех найти: 1 точка входа, разные BI ИИ в тестировании: зачем мы пошли в пилот и почему начали с чата, а не с агентов Как я научила Telegram-бота наводить порядок в чате с мемами: пересылка по хештегам в соответствующую тему Как мы сделали внутреннюю CRM для управления студией – опыт Doubletapp Десятипальцевый метод — как печатать цифру " Шесть "? Партнерская программа по нейросетям: зарабатывай на ИИ, приводя клиентов в AI-сервис Как я сделал «клик по элементу → открыть в VS Code» за один вечер Эволюция Telegram‑бота на C++: от «лапши» в main() до ООП, in‑memory кэша и мутов по Фибоначчи Как я (внезапно) стал адвокатом вайб‑кодинга в корпорации Дизайн за 5 минут. Дайджест мая 2026 Только 17% всех 64-битных целых чисел можно разложить на два 32-битных 0,000000001% × ∞ = 100%. Вы осознаёте что любое событие неизбежно? «Вы либо трусы наденьте, либо крестик снимите». Как мы выиграли еще один суд против PR-агентства PRslon Почему вы тратите время не на переговоры, а на чужую внутреннюю драму. Как проходят переговоры с крупными компаниями Как приоритизировать регрессионные проверки, когда сжаты сроки релиза Электронные транспортные накладные: технический разбор нововведений 2026 года для логистов, разработчиков и бизнеса Как определить LLM под капотом чат-бота: учебный эксперимент по black-box fingerprinting Хабру 20 лет — зовём вас отметить это к нам Домой iPad как инструмент разработчика в эпоху агентного программирования Inspector v3: как я сделал свой центр управления Kubernetes на старом ноутбуке Как мы осваивали производство гибко-жёстких печатных плат: от проб и ошибок к рабочей технологии 30 лет мы внедряли в России Ansys. А потом он ушёл — и пришлось садиться писать собственный CAE для аддитивной печати Цифровой рубль и цифровой чек Облако под защитой от DDoS: чем On-Demand отличается от Always-On Распродажа в издательстве «Питер» Почему современный стадион больше похож на ЦОД, чем на арену Машина, которая учится думать Запихнули игровую приставку в короб и в первый же месяц продали на 3 млн Игровой ноутбук vs игровой ПК за те же деньги: что изменилось в 2026 году ГИС для Minecraft. Часть 1 Смена старого оборудования на новое убирает огромные затраты на его эксплуатацию — но куда девать всё это старое? Project Manager 2026: как AI-инструменты меняют профессию SLA как инструмент, а не отчёт. Часть 1. Как подружить бизнес и инженеров через общие цифры Послания от ангелов и первый шаг к компьютерам: стеганография Средневековья и Ренессанса Что новенького есть в CSS в 2026 году? Хватит мучить ChatGPT. Почему ваш промпт не сработает Как и зачем мы писали семантический слой для ИИ аналитики – SLayer Маленькая EVPN/VXLAN-фабрика без тупика: как мы запускали площадку в Амстердаме Репликация по DDIA: что я понял, только когда сам сломал прод RAG без downtime: настраиваем инкрементальное обновление документов на Qdrant и LangChain Тени истории: война машин. Как «Энигма» и «Фиалка» определили исход Второй мировой войны
Gamedev. Парсинг данных из Google Sheets и Excel в json без привлечения программистов
saigor33 · 2026-05-27 · via Все публикации подряд на Хабре

Вы когда-нибудь заполняли json-конфигов на 20 000 - 25 0000 строк вручную перед выпуском релиза? А боль в глазах геймдизайнеров от этого процесса видели?

Вы TechLead/Менеджер и к вам часто подходят дизайнеры с просьбой написать парсер данных, а свободных рук нет? А после изменений в фиче приходится выделять человека для правок схемы парсинга под новую разметку?

Возможно, пора начать использовать тулзу по экспорту данных, которую смогут настроить сами геймдизайнеры? Нам этот инструмент сократил время настройки игровых конфигов с 4 дней до 15 минут, после предварительной настройки.

Привет! Меня зовут Игорь, я занимаюсь разработкой на Unity c 2018 года. В статье рассказываю о тулзе, с помощью которой можно выгружать данные из Google Sheets и Excel в json без привлечения программистов.

P.S. в конце статьи есть видосик с процессом настройки и экспорта одной фичи.

Оглавление

  1. Контекст и требования к инструменту

  2. Немного теории о структуре json

  3. О парсере

  4. Видео с примером использования для Google Sheets

  5. Что инструмент умеет?

  6. Где найти парсер?

  7. Дополнительно

Контекст и требования к инструменту

Имеется мультиплеерный F2P проект. Релизы раз в две недели.
Практически каждый релиз выпускаются новые фичи.
Иногда могут происходить ребалансы уже существующих фич.
Несколько раз был глобальный ребаланс (баланс менялся практически в каждой фиче).

Так вот к чему это?
Представьте сколько человеко-часов на то, чтобы данные просто перенести из таблиц в конфиги.
Представьте кол-во итераций изменений конфигов для внутреннего теста баланса.
Представьте сколько времени нужно, чтобы тестировщики проверили итоговый результат. Представьте кол-во ошибок при переносе.

Эта рутинная работа занимает много времени людей, вместо того чтобы заниматься более важными задачами. Такие длительные процедуры создают риски срыва даты релиза.

Меня, как техлида, это не устраивало, хотелось как-то помочь ребятам.
Так появились мысли о том, что нужен инструмент экспорта\парсинга, который упростит жизнь и сделает это дело более надёжным. Но не хотелось создавать инструмент слишком частным, чтобы его постоянно приходилось допиливать и постоянно выделять под это дело программистов.

К инструменту появились следующие требования:

  • Геймдизайнеры должны самостоятельно настраивать и перенастраивать инструмент по мере необходимости

  • Инструмент не должен требовать знаний программирования (актуально для геймдизов)

  • Инструмент не должен требовать привлечения программистов (Вообще. Это было самое важное условие для меня)

  • В json конфигах может быть большая вложенность уровней. Инструмент должен быть универсальным, поддерживать неограниченное кол-во уровней вложенности.

  • Инструмент должен поддерживать возможность использовать ячейки из таблиц гибко, а не требовать таблицу MxN (данные могут быть разбросаны на разных страницах и т.д.)

  • Инструмент должен иметь возможность заполнять объекты json с плавающим кол-вом полей (например, массив объектов, где один элемент будет иметь 2 поля, а другой 4 поля)

  • Инструмент, там где это возможно, не должен прекращать парсинг, если что-то неправильно введено. Ошибки должны подсвечиваться как предупреждение.

  • Открытый исходный код. В компании достаточно строгие правила по безопасности.
    Левый софт особо не поиспользуешь (NDA, потенциальные утечки и т.д.).

  • Инструмент должен предоставлять возможность выносить повторяющуюся структуру json‑объектов в аналог математической функции, которая принимает параметры на вход func(level, amount), и преобразует это в блок текста json

Позднее добавились пожелания от геймдизайнеров:

  • Каждый новый уровень json - это отдельный Google Sheets лист

  • Все фичи можно размещать вперемешку на Google Sheets листах с уровнями семантики парсинга (не создавать под каждую фичу свои листы с уровнями, разделять фичи за счёт группировки строк через сворачивание в “+”)

Изначально искали решение на просторах интернета. К сожалению ничего полезного найти не удалось, всё что попадалось решало очень частные задачи.

Решил написать самостоятельно, как пет-проект.

Немного теории о структуре json

Json можно представлять в виде иерархической (древовидной) структуру, где есть верхнее звено и от него расходятся ветви, которые имеют свои звенья. Мы можем обходить это дерево. Каждый раз когда мы переходим по ветви глубже, мы спускаемся на следующий уровень. На следующем уровне может быть как звено, которое ведёт к следующему уровню, любо содержать конечное значение (строку, число, логическое значение).

Идея парсера в том, чтобы описать эти звенья как промежуточные узлы в таком формате, чтобы Google Sheets и Excel возможности могли относительно легко подставлять значения в промежуточные части, если придерживаться определённой семантической структуры.

Пример уровней json файла

Пример уровней json файла

О парсере

Исходя из идеи парсера и требований к этому парсеру, было получено решение, которое описывает узлы как структуру название(name) - тип данных(type) - значение (value). Т.к. следующий уровень может быть узлом, а не значением, то значение может быть ссылающиеся на другой узел (reference type - ref).

Так получился парсер, который поддерживает следующие типы данных-полей:

  • str – текстовое поле

  • num – числовое поле

  • bool – логическое поле

  • null – поле со значением null

  • object – вложенный json объект (именуется как ref)

  • arr - массив других типов

  • alias функции – аббревиатура формата математической функции func(level, amount) для повторяющихся элементов, принимающая изменяющиеся данные как параметр.

Видео с примером использования для Google Sheets

Ниже на видео пример использования парсера с применением формулы FILTER для экспорта данных из Google Sheets.

Что на видео:

  • В начале видео показана таблица данных, которую нужно экспортировать в json. Показан примерный формат json, который используется для фичи (пример данных для конфига).

  • Подготовка парсера (настройка alias функций).
    Это не полная процедура настройки парсера, а только основной фрагмент.
    Остальная часть — это добавление в конфиг парсинга нескольких строк с описанием фичи.

  • Заполнение семантики парсинга в Google Sheets документе

  • Подготовка исходных данных, для применения формулы FILTER

  • Заполнение оставшейся семантики с использованием формулы FILTER

  • Процесс экспорта данных

Если видео не загрузится: Youtube

P.S. В Excel формулы немного другие из-за разной работы формул.

Итог: за 13 минут (видео ускорил, чтобы не смотреть рутинные действия) сделал частичную предварительную настройку парсера и экспортировал 400 строк данных в json файл. На продакшен проекте такая фича является ротируемой(каждые 2 недели смена), обычно имеет 30 stages, около 15 вариантов alias функций, что в среднем даёт 2 000 json-строк.

Дисклеймер

Первичная настройка парсера и семантики может быть долгой. Зависит от Ваших навыков владения Google Sheets/Excel и фантазии как по удобнее располагать данные для скорости интеграции.

Что инструмент умеет?

  • Поддерживает Excel и Google Sheets источники данных

  • Гибкая настройка схемы парсинга json с неограниченной вложенностью объектов. Схема переопределяется непосредственно в источнике с данными. Не требует привлечения программистов и не требует изменения исходного кода.

    Предварительно нужно понять простою идею как заполняются данные и как происходит разделение на слои.

  • Добавлены два типа Alias функций (функции которые сокращают повторяющиеся структуры за счёт параметров)

    TableAliasFunc - настраивается в Google Sheets на отдельных Google Sheets листах (по тем же правилам, что и обычная семантика)
    JsonAliasFunc - настраиваются в отдельных json-файлах.

  • Alias-функции поддерживают как именованные параметры (человеко читаемые: amount, level и т.д.), так и анонимные (arg1, arg2, arg3). Читайте инструкцию как какие параметры использовать.

  • TableAlias-функции могут использовать другие alias функции, включая JsonAlias-функции.

  • Параметры Alias-функций можно пробрасывать во вложенные Alias-функции

  • Можно настроить место парсинга фичей, каждая фича в свой файл, по своему пути.

  • Открытый исходный код. Если нужно сканируйте/изучайте исходники, можно вносить изменения под свой проект.

  • Mit-лицензия. Можно использовать бесплатно, включая коммерческое использование.

Где найти парсер?

В репозитории с исходным кодом на GitHub написана подробная инструкция, как настроить и использовать. Так же написана и инструкция как подключить Google Sheets. В репозитории Вы найдёте больше примеров семантики парсинга в разных вариации в Excel-файле и по ссылке на такой Google Sheets файл.

GitHub репозиторий: Тык

Кому хочется побыстрее посмотреть семантику парсинга в Google Sheets: Тык
P.S. Документ доступен как пример в режиме только для чтения. Если хотите что-то потыкать, то копируйте на свой диск.

Как рекомендую действовать:

  • Сделать настройку по инструкции из репозитория

  • Рекомендую почитать инструкцию, хотя бы по диагонали (инструкция должна снять большинство вопросов)

  • Потыкать файлы в папке Example (Config.json, JsonAliasFuncs)

  • Отключить лишние тестовые фичи для парсинга из тестового конфига парсинга и включать их по одной, попутно экспериментируя с редактированием и добавлением полей.

Дополнительно

Если вас тоже интересует улучшение рабочих процессов, то возможно вас заинтересуют другие мои статьи:

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

0%Переносим вручную, будем пробовать этот инструмент0

0%Переносим вручную, НЕ будем пробовать этот инструмент0

0%Используем внутри-проектный/сторонний(делитесь ссылкой в комментах) парсер, будем пробовать этот инструмент0

0%Используем внутри-проектный/сторонний(делитесь ссылкой в комментах) парсер, НЕ будем пробовать этот инструмент0

0%Я не занимаюсь экспортом данных0

Никто еще не голосовал. Воздержался 1 пользователь.