Qt Widgets Application —— 修补

这个软件主要功能就是对.csv文件进行的数据修补,可以对得到数据的采样频率进行修补。

前言

最近在学习采集设备,遇到数据丢失问题。设置的1024采样率但实际采样率只有128,但是实时的秒数上是按1024的秒刻度进行记录,说明丢失了996个秒刻度的数据。于是设计了一个修复算法可以把丢失的秒刻度数据修补完整。

Part One

这是我的设计ui,简洁而明了。

Part Two

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
#include <random>
#include <map>
#include <vector>
#include <QStringList>
#include <QDir>  // 添加这个头文件用于目录操作
#include <QDebug>
#include <QProgressBar>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    this->setWindowTitle(QString("修补软件"));

    // 连接 pushButton 的点击信号到槽函数
    connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::onBrowseButtonClicked);
    // 连接 pushButton_2 的点击信号到槽函数
    connect(ui->pushButton_2, &QPushButton::clicked, this, &MainWindow::onProcessButtonClicked);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onBrowseButtonClicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open CSV File"), "", tr("CSV Files (*.csv);;All Files (*)"));
    if (!fileName.isEmpty()) {
        ui->lineEdit->setText(fileName);
    }
}

void MainWindow::onProcessButtonClicked()
{
    QString filePath = ui->lineEdit->text();
    if (filePath.isEmpty()) {
        QMessageBox::warning(this, tr("Error"), tr("Please select a CSV file first."));
        return;
    }
    processCSV(filePath);
}

void MainWindow::processCSV(const QString& filePath)
{
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        QMessageBox::warning(this, tr("Error"), tr("Unable to open the file."));
        return;
    }

    QTextStream in(&file);
    std::map<QString, std::vector<std::vector<QString>>> dataGroups; // 存储按A1分组的数据

    // 读取文件内容并按A1分组
//    while (!in.atEnd()) {
//        QString line = in.readLine();
//        QStringList parts = line.split(',');

//        if (parts.size() < 4) continue; // 确保至少有四个列

//        QString a1 = parts[0].split('.')[0]; // 获取A1
//        QString a2 = parts[0].split('.')[1]; // 获取A2
//        QString b = parts[1];
//        QString c = parts[2];
//        QString d = parts[3];

//        std::vector<QString> row = {a1, a2, b, c, d};
//        dataGroups[a1].push_back(row);
//    }


    // 读取文件内容并按A1分组
        int totalLines = 0;
        while (!in.atEnd()) {
            in.readLine();
            totalLines++;
        }
        file.seek(0);  // 重置文件指针,回到文件开始处

        // 设置进度条范围
        ui->progressBar->setRange(0, totalLines);
        ui->progressBar->setValue(0);  // 初始化为0

        int processedLines = 0;  // 已处理的行数

    while (!in.atEnd()) {
        QString line = in.readLine();
        QStringList parts = line.split(',');

        if (parts.size() < 4) continue; // 确保至少有四个列

        QStringList aParts = parts[0].split('.');
        if (aParts.size() < 2) continue; // 确保A列的数据格式为 A1.A2

        QString a1 = aParts[0]; // 获取A1
        QString a2 = aParts[1]; // 获取A2
        QString b = parts[1];
        QString c = parts[2];
        QString d = parts[3];

        std::vector<QString> row = {a1, a2, b, c, d};
        dataGroups[a1].push_back(row); // 按A1分组存储

        processedLines++;
        ui->progressBar->setValue(processedLines);  // 更新进度条
    }

    file.close();

    // 获取源文件的目录
    QFileInfo fileInfo(filePath);
    QString dirPath = fileInfo.absolutePath();
    QString outputFilePath = dirPath + "/repaired_data.csv";

    // 修补数据并输出到新文件
    QFile outFile(outputFilePath);
    if (!outFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
        QMessageBox::warning(this, tr("Error"), tr("Unable to create the output file."));
        return;
    }

    QTextStream out(&outFile);
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<> dis(-0.005, 0.005);

//    for (auto& group : dataGroups) {
//        auto& rows = group.second;

//        if (rows.empty()) continue; // 确保rows不为空

//        // 扩充每组到1024行
//        for (size_t i = 0; i < 1024; ++i) {
//            QString a1 = rows[0][0];
//            QString a2 = a2Values[i]; // 使用固定的A2值

//            // 计算访问的行索引,确保不超出rows.size()
//            size_t index = i % rows.size();

//            // 获取B, C, D的上一个值,并随机微调
//            QString b = rows[index][2];
//            QString c = rows[index][3];
//            QString d = rows[index][4];

//            double b_val = b.toDouble() + dis(gen);
//            double c_val = c.toDouble() + dis(gen);
//            double d_val = d.toDouble() + dis(gen);

//            out << a1 << "." << a2 << "," << QString::number(b_val, 'f', 6) << ","
//                << QString::number(c_val, 'f', 6) << "," << QString::number(d_val, 'f', 6) << "\n";
//        }
//    }
    for (const auto& group : dataGroups) {
        qDebug() << "Processing A1 group:" << group.first;
        const auto& rows = group.second;

        if (rows.empty()) continue; // 确保rows不为空

        QString a1 = rows[0][0]; // 获取当前分组的A1值

        // 扩充每组到1024行
        for (size_t i = 0; i < 1024; ++i) {
            QString a2 = a2Values[i]; // 使用固定的A2值

            // 计算访问的行索引,确保不超出rows.size()
            size_t index = i % rows.size();

            // 获取B, C, D的上一个值,并随机微调
            QString b = rows[index][2];
            QString c = rows[index][3];
            QString d = rows[index][4];

            double b_val = b.toDouble() + dis(gen);
            double c_val = c.toDouble() + dis(gen);
            double d_val = d.toDouble() + dis(gen);

            // 输出修补后的数据
            out << a1 << "." << a2 << "," << QString::number(b_val, 'f', 6) << ","
                << QString::number(c_val, 'f', 6) << "," << QString::number(d_val, 'f', 6) << "\n";
        }
    }



    outFile.close();
    ui->progressBar->setValue(totalLines);  // 修补完成后,将进度条设置为最大值
    ui->lineEdit_2->setText(outputFilePath); // 将输出文件路径显示到lineEdit_2
    QMessageBox::information(this, tr("Success"), tr("Data has been repaired and saved."));
}

 

Part Three

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <vector>
#include <QString>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void onBrowseButtonClicked();      // 浏览文件槽函数
    void onProcessButtonClicked();     // 处理文件槽函数

private:
    Ui::MainWindow *ui;

    void processCSV(const QString& filePath); // 处理CSV文件的函数

    // A2数据的固定序列,假设已经定义好
    const std::vector<QString> a2Values = {
        "000000","000977","001953","002930","003906","004883","005859","006836","007813","008789",
        "009766","010742","011719","012695","013672","014648","015625","016602","017578","018555",
        "019531","020508","021484","022461","023438","024414","025391","026367","027344","028320",
        "029297","030273","031250","032227","033203","034180","035156","036133","037109","038086",
        "039063","040039","041016","041992","042969","043945","044922","045898","046875","047852",
        "048828","049805","050781","051758","052734","053711","054688","055664","056641","057617",
        "058594","059570","060547","061523","062500","063477","064453","065430","066406","067383",
        "068359","069336","070313","071289","072266","073242","074219","075195","076172","077148",
        "078125","079102","080078","081055","082031","083008","083984","084961","085938","086914",
        "087891","088867","089844","090820","091797","092773","093750","094727","095703","096680",
        "097656","098633","099609","100586","101563","102539","103516","104492","105469","106445",
        "107422","108398","109375","110352","111328","112305","113281","114258","115234","116211",
        "117188","118164","119141","120117","121094","122070","123047","124023","125000","125977",
        "126953","127930","128906","129883","130859","131836","132813","133789","134766","135742",
        "136719","137695","138672","139648","140625","141602","142578","143555","144531","145508",
        "146484","147461","148438","149414","150391","151367","152344","153320","154297","155273",
        "156250","157227","158203","159180","160156","161133","162109","163086","164063","165039",
        "166016","166992","167969","168945","169922","170898","171875","172852","173828","174805",
        "175781","176758","177734","178711","179688","180664","181641","182617","183594","184570",
        "185547","186523","187500","188477","189453","190430","191406","192383","193359","194336",
        "195313","196289","197266","198242","199219","200195","201172","202148","203125","204102",
        "205078","206055","207031","208008","208984","209961","210938","211914","212891","213867",
        "214844","215820","216797","217773","218750","219727","220703","221680","222656","223633",
        "224609","225586","226563","227539","228516","229492","230469","231445","232422","233398",
        "234375","235352","236328","237305","238281","239258","240234","241211","242188","243164",
        "244141","245117","246094","247070","248047","249023","250000","250977","251953","252930",
        "253906","254883","255859","256836","257813","258789","259766","260742","261719","262695",
        "263672","264648","265625","266602","267578","268555","269531","270508","271484","272461",
        "273438","274414","275391","276367","277344","278320","279297","280273","281250","282227",
        "283203","284180","285156","286133","287109","288086","289063","290039","291016","291992",
        "292969","293945","294922","295898","296875","297852","298828","299805","300781","301758",
        "302734","303711","304688","305664","306641","307617","308594","309570","310547","311523",
        "312500","313477","314453","315430","316406","317383","318359","319336","320313","321289",
        "322266","323242","324219","325195","326172","327148","328125","329102","330078","331055",
        "332031","333008","333984","334961","335938","336914","337891","338867","339844","340820",
        "341797","342773","343750","344727","345703","346680","347656","348633","349609","350586",
        "351563","352539","353516","354492","355469","356445","357422","358398","359375","360352",
        "361328","362305","363281","364258","365234","366211","367188","368164","369141","370117",
        "371094","372070","373047","374023","375000","375977","376953","377930","378906","379883",
        "380859","381836","382813","383789","384766","385742","386719","387695","388672","389648",
        "390625","391602","392578","393555","394531","395508","396484","397461","398438","399414",
        "400391","401367","402344","403320","404297","405273","406250","407227","408203","409180",
        "410156","411133","412109","413086","414063","415039","416016","416992","417969","418945",
        "419922","420898","421875","422852","423828","424805","425781","426758","427734","428711",
        "429688","430664","431641","432617","433594","434570","435547","436523","437500","438477",
        "439453","440430","441406","442383","443359","444336","445313","446289","447266","448242",
        "449219","450195","451172","452148","453125","454102","455078","456055","457031","458008",
        "458984","459961","460938","461914","462891","463867","464844","465820","466797","467773",
        "468750","469727","470703","471680","472656","473633","474609","475586","476563","477539",
        "478516","479492","480469","481445","482422","483398","484375","485352","486328","487305",
        "488281","489258","490234","491211","492188","493164","494141","495117","496094","497070",
        "498047","499023","500000","500977","501953","502930","503906","504883","505859","506836",
        "507813","508789","509766","510742","511719","512695","513672","514648","515625","516602",
        "517578","518555","519531","520508","521484","522461","523438","524414","525391","526367",
        "527344","528320","529297","530273","531250","532227","533203","534180","535156","536133",
        "537109","538086","539063","540039","541016","541992","542969","543945","544922","545898",
        "546875","547852","548828","549805","550781","551758","552734","553711","554688","555664",
        "556641","557617","558594","559570","560547","561523","562500","563477","564453","565430",
        "566406","567383","568359","569336","570313","571289","572266","573242","574219","575195",
        "576172","577148","578125","579102","580078","581055","582031","583008","583984","584961",
        "585938","586914","587891","588867","589844","590820","591797","592773","593750","594727",
        "595703","596680","597656","598633","599609","600586","601563","602539","603516","604492",
        "605469","606445","607422","608398","609375","610352","611328","612305","613281","614258",
        "615234","616211","617188","618164","619141","620117","621094","622070","623047","624023",
        "625000","625977","626953","627930","628906","629883","630859","631836","632813","633789",
        "634766","635742","636719","637695","638672","639648","640625","641602","642578","643555",
        "644531","645508","646484","647461","648438","649414","650391","651367","652344","653320",
        "654297","655273","656250","657227","658203","659180","660156","661133","662109","663086",
        "664063","665039","666016","666992","667969","668945","669922","670898","671875","672852",
        "673828","674805","675781","676758","677734","678711","679688","680664","681641","682617",
        "683594","684570","685547","686523","687500","688477","689453","690430","691406","692383",
        "693359","694336","695313","696289","697266","698242","699219","700195","701172","702148",
        "703125","704102","705078","706055","707031","708008","708984","709961","710938","711914",
        "712891","713867","714844","715820","716797","717773","718750","719727","720703","721680",
        "722656","723633","724609","725586","726563","727539","728516","729492","730469","731445",
        "732422","733398","734375","735352","736328","737305","738281","739258","740234","741211",
        "742188","743164","744141","745117","746094","747070","748047","749023","750000","750977",
        "751953","752930","753906","754883","755859","756836","757813","758789","759766","760742",
        "761719","762695","763672","764648","765625","766602","767578","768555","769531","770508",
        "771484","772461","773438","774414","775391","776367","777344","778320","779297","780273",
        "781250","782227","783203","784180","785156","786133","787109","788086","789063","790039",
        "791016","791992","792969","793945","794922","795898","796875","797852","798828","799805",
        "800781","801758","802734","803711","804688","805664","806641","807617","808594","809570",
        "810547","811523","812500","813477","814453","815430","816406","817383","818359","819336",
        "820313","821289","822266","823242","824219","825195","826172","827148","828125","829102",
        "830078","831055","832031","833008","833984","834961","835938","836914","837891","838867",
        "839844","840820","841797","842773","843750","844727","845703","846680","847656","848633",
        "849609","850586","851563","852539","853516","854492","855469","856445","857422","858398",
        "859375","860352","861328","862305","863281","864258","865234","866211","867188","868164",
        "869141","870117","871094","872070","873047","874023","875000","875977","876953","877930",
        "878906","879883","880859","881836","882813","883789","884766","885742","886719","887695",
        "888672","889648","890625","891602","892578","893555","894531","895508","896484","897461",
        "898438","899414","900391","901367","902344","903320","904297","905273","906250","907227",
        "908203","909180","910156","911133","912109","913086","914063","915039","916016","916992",
        "917969","918945","919922","920898","921875","922852","923828","924805","925781","926758",
        "927734","928711","929688","930664","931641","932617","933594","934570","935547","936523",
        "937500","938477","939453","940430","941406","942383","943359","944336","945313","946289",
        "947266","948242","949219","950195","951172","952148","953125","954102","955078","956055",
        "957031","958008","958984","959961","960938","961914","962891","963867","964844","965820",
        "966797","967773","968750","969727","970703","971680","972656","973633","974609","975586",
        "976563","977539","978516","979492","980469","981445","982422","983398","984375","985352",
        "986328","987305","988281","989258","990234","991211","992188","993164","994141","995117",
        "996094","997070","998047","999023",
    };
};

#endif // MAINWINDOW_H

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值