Как преобразовать табличный формат или формат, эквивалентный фрейму данных Python, в формат msgpack в C++

(Обратите внимание: я не могу вставлять сюда изображения. У меня недостаточно очков для этого. Может ли кто-нибудь помочь мне с этим.)

Я понимаю, как преобразовать структуру, соответствующую следующему табличному формату (Struct1), в формат msgpack:

Struct1

Для этого я использую следующий код:

#include <sstream>
#include <iostream>
#include <msgpack.hpp>

inline std::ostream& hex_dump(std::ostream& o, std::string const& v) {
    std::ios::fmtflags f(o.flags());
    o << std::hex;
    o << "b\'";
    for (auto c : v) {
        o << "\\x" << std::setw(2) << std::setfill('0') << (static_cast<int>(c) & 0xff);
    }
    o << "\'";
    o.flags(f);
    return o;
}

struct your_type {
    int a;
    int b;
    MSGPACK_DEFINE(a, b);
};

int main() {
    // packing
    std::stringstream ss;
    std::stringstream sshex;
    std::string ssnew;
    std::vector<std::map<std::string, your_type>> v
    {
        {
            { "t",{ 1, 2} }

        },
        //{
            { "value",{6, 5 } }
        }
    };

    msgpack::pack(ss, v);


    auto oh = msgpack::unpack(ss.str().data(), ss.str().size());
    // JSON output
    std::cout << oh.get() << std::endl;

    std::cout << std::endl;
    // hex dump output
    hex_dump(sshex, ss.str()) << std::endl;

    std::cout << sshex.str();

    ssnew = sshex.str();

    return ssnew;

}

Теперь я хотел бы попробовать преобразовать в тот же формат следующее:

Я хочу добавить каждую строку в цикл, передать значения через цикл в структуру, а затем преобразовать в формат msgpack. Снова повторите процесс после добавления еще одной строки. Я не хочу статически определять значения, как раньше. Например:

Первый раз - данные переданы для конвертации (Struct2):

Struct2

Второй раз - данные переданы для конвертации (Struct3): Struct3

Я пробовал использовать int для t и массив int для val. Я не могу продолжить. Я исследовал библиотеку msgpack, но напрасно. Может ли кто-нибудь помочь мне, как я могу это сделать? Даже небольшое руководство было бы очень полезно.

Обычная реализация таблиц состоит в том, чтобы представить каждую строку с помощью struct или class и использовать std::vector<class> для представления таблицы. Кроме того, используйте std::map<key, vector_index> в качестве индексной таблицы в таблице (использование индексных таблиц означает, что вам не нужно продолжать сортировать таблицу).

Thomas Matthews 29.11.2018 18:50

Чего вы пытаетесь достичь с помощью std::vector<std::map<std::string, your_type>>?

Thomas Matthews 29.11.2018 18:51

По моему опыту, вам лучше иметь структуру, а затем заполнять ее из буфера (например, MSGPACK). Это позволяет вам учитывать порядок байтов, упаковку, заполнение для выравнивания и эффективности целочисленных типов процессора. Например, сообщение может иметь байтовое поле, но процессор более эффективен с целочисленным значением.

Thomas Matthews 29.11.2018 18:53

Большое спасибо за ваш ответ. Я пробую то, что вы предложили. Я использую структуру для каждого столбца. Я буду добавлять строки на разных этапах, поэтому я выбрал столбец для каждой структуры. Не могли бы вы посоветовать мне, как я могу объединить разные столбцы и их имена в таблицу с помощью std :: vector?

Aparna Bose 03.12.2018 10:22

Обычно каждая строка моделируется структурой. Вы можете использовать std::vector для ряда. Поскольку вы не вставляли структуры как текст, я не могу вам больше помочь. Брандмауэры блокируют мой доступ к вашим ссылкам.

Thomas Matthews 03.12.2018 15:59

Я пробовал следующее, чтобы представить карту std :: map <std :: string, std :: vector <double>>; Я хочу вставить значение, если найду ключ на этой карте ... Я использую этот итератор для (auto const & ent1: map) {auto const & outer_key = ent1.first; авто const & inner_list = ent1.second; } Но я не могу вставить значение в inner_list. Я пробовал поставить. Ошибки не выдает, но не вставляет. не могли бы вы сказать мне, правильно ли это?

Aparna Bose 03.12.2018 17:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
101
0

Другие вопросы по теме