这个软件主要功能就是对.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