Как я могу конвертировать из JSON в CSV в Qt - PullRequest
0 голосов
/ 20 июня 2019

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

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

PS Я храню данные в формате Json.Я скопирую пример ниже.

файл haccp.json:

{
    "alarm_message": "",
    "alarm_title": "",
    "alarm_type": -1,
    "alarm_value": -1,
    "color": "#b96265",
    "date": "20 giu 2019",
    "details": [
        {
            "chamber_rd": "0",
            "chamber_sp": "180",
            "core_rd": "0",
            "core_sp": "--",
            "phase": "1",
            "steam_mode": "Conv",
            "time": "17:58"
        },
        {
            "chamber_rd": "0",
            "chamber_sp": "180",
            "core_rd": "0",
            "core_sp": "--",
            "phase": "1",
            "steam_mode": "Conv",
            "time": "17:58"
        }        
    ],
    "end": "17:59",
    "is_alarm": false,
    "start": "17:58",
    "type": "Manual"
}

ОБНОВЛЕНИЕ: Файл csv должен иметь следующий формат столбца: Тип, Дата, Начало, Конец, Время, SteamРежим, Фаза, Камера RD, Камера SP, Core RD, Core SP

Также я сохраняю и записываю файл Json:

void HaccpModel::start_program(QString program_name)
{
    running_program      = true;
    running_program_name = program_name;

    int sample_step = 3000;
    sample_step_timer.start(sample_step);

    hi_current.type = program_name;
    hi_current.date =
        QDate::currentDate().toString(QStringLiteral("dd MMM yyyy"));
    hi_current.start = QTime::currentTime().toString(QStringLiteral("hh:mm"));
    hi_current.color = get_color();
    haccp_list.emplace_back(hi_current);
}

void HaccpModel::stop_program()
{
    haccp_list.back().end =
        QTime::currentTime().toString(QStringLiteral("hh:mm"));

    sort_haccp();

    if (!running_program) {
        return;
    }
    running_program = false;

    sample_step_timer.stop();

    save_haccp();
}

// I call this function from a connect, connected to the timer
void HaccpModel::add_haccp_details()
{
    HaccpDetail d;

    d.time  = QTime::currentTime().toString(QStringLiteral("hh:mm"));
    d.phase = QString::number(
        MachineState::get_instance().get_current()->get_current_phase() + 1);
    d.steam_mode = get_steam_mode(
        MachineState::get_instance().get_current()->get_oven_mode());
    d.chamber_sp = QString::number(
        MachineState::get_instance().get_current()->get_oven_temp());
    d.chamber_rd = QString::number(ps->get_oven_probe_gui());
    d.core_sp    = "--";

    d.core_rd = QString::number(ps->get_probe1_gui());

    haccp_list.back().details.emplace_back(d);

    sort_haccp();
}

void HaccpModel::save_haccp()
{
    auto haccp_file =
        Path().get_haccp_path() +
        QStringLiteral("haccp_%1.json")
            .arg(QDateTime::currentDateTime().toString("yyyy_MM_dd_hh_mm_ss"));

    Serializer().write(this, haccp_file);
}

void Serializer::write(ISerializable *subject, const QString &filename)
{
    QFile f(filename);
    if (!f.open(QIODevice::ReadWrite)) {
        Logger::singleton.log(
            QtWarningMsg, serialization(),
            QStringLiteral("can't open %1 in write mode").arg(filename));
    }

    f.resize(0);
    QJsonDocument doc(subject->get_json_obj());
    f.write(doc.toJson());
}

Спасибо

1 Ответ

2 голосов
/ 20 июня 2019

Вы можете прочитать файл и разобрать его следующим образом:

QFile file("haccp.json");
file.open(QIODevice::ReadOnly | QIODevice::Text);
auto jsonDoc = QJsonDocument::fromJson(file.readAll()).object();
file.close();

CSV может быть написано так, обратите внимание на флаг QIODevice::Truncate.

QFile csv("haccp.csv");
csv.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate);
QTextStream out(&csv);
// CSV Header
out << "Type,Date,Start,End,Time,Steam Mode,Phase,Chamber RD,Chamber SP,Core RD,Core SP";
endl(out);

for (auto d : json.value("details").toArray()) {
    auto detail = d.toObject();
    out << json.value("type").toString() << ',';
    out << json.value("date").toString() << ',';
    out << json.value("start").toString() << ',';
    out << json.value("end").toString() << ',';

    out << detail.value("time").toString() << ',';
    out << detail.value("steam_mode").toString() << ',';
    out << detail.value("phase").toString() << ',';
    out << detail.value("chamber_rd").toString() << ',';
    out << detail.value("chamber_sp").toString() << ',';
    out << detail.value("core_rd").toString() << ',';
    out << detail.value("core_sp").toString() << ',';
    endl(out);
}
csv.close();

Ваш пример json будет производить этот CSV:

Type,Date,Start,End,Time,Steam Mode,Phase,Chamber RD,Chamber SP,Core RD,Core SP
Manual,20 giu 2019,17:58,17:59,17:58,Conv,1,0,180,0,--,
Manual,20 giu 2019,17:58,17:59,17:58,Conv,1,0,180,0,--,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...