fork download
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <qfile.h>
  4. #include <qfiledialog.h>
  5. #include <qtextstream.h>
  6.  
  7. //Структура для массивов
  8. struct myList{
  9. QString key;
  10. QString value;
  11. };
  12. //Массив для хранения списка из файла .csv
  13. QList<myList*> csvList;
  14. //Массив для хранения списка из файла .json
  15. QList<myList*> jsonList;
  16. //Словарь для преобразования оффсета в число
  17. QMap<QString, int> offsetConvert = { {"double", 8}, {"int", 4}, {"bool", 1} };
  18.  
  19. MainWindow::MainWindow(QWidget *parent)
  20. : QMainWindow(parent)
  21. , ui(new Ui::MainWindow)
  22. {
  23. ui->setupUi(this);
  24.  
  25. //Вывод начальной информации в текстбраузер
  26. ui->textBrowser->setText("1. Open a .csv file\n\n"
  27. "2. Select Tag\n\n"
  28. "3. Open a .json file\n\n"
  29. "4. Export result\n\n");
  30. }
  31.  
  32. MainWindow::~MainWindow()
  33. {
  34. delete ui;
  35. }
  36.  
  37. void MainWindow::on_csvOpen_clicked()
  38. {
  39. csvList.clear();
  40. int i=0;
  41. ui->comboBox->clear();
  42.  
  43. //Функция выбора файла .csv
  44. QString fileName = QFileDialog::getOpenFileName(this, tr("Open .csv file"), "", tr(".csv (*.csv)"));
  45. QFile file(fileName);
  46. file.open(QIODevice::ReadOnly);
  47.  
  48. //Цикл на чтение файла построчно, пока он не закончится
  49. while (!file.atEnd()){
  50. QString inputLine = file.readLine();
  51.  
  52. //Разделение строки на слова, разделитель - ;
  53. auto inputParts = inputLine.split(";", Qt::SkipEmptyParts);
  54.  
  55. //Пропуск строки с заголовками
  56. if (inputParts[0]=="Tag"){
  57. continue;
  58. }
  59.  
  60. //Заполнение массива
  61. csvList.append(new myList);
  62. csvList[i]->key=inputParts[0];
  63. csvList[i]->value=inputParts[1];
  64. ui->comboBox->addItem(inputParts[0]);
  65. i++;
  66.  
  67. }
  68. file.close();
  69. ui->jsonOpen->setEnabled(true);
  70. }
  71.  
  72. void MainWindow::on_jsonOpen_clicked()
  73. {
  74. jsonList.clear();
  75. ui->textBrowser->clear();
  76.  
  77. bool matches=0; //Переменная для нахождения начала списка аргументов
  78. int offset=0; //Переменная для накопления оффсета
  79. int k=0; //Указатель на элемент массива
  80. QString findValue; //Переменная для хранения типа
  81.  
  82. //Поиск в массиве тега и соответствующего ему типа
  83. QString findKey = ui->comboBox->currentText();
  84. for (int i=0;i<csvList.size();i++){
  85. if (csvList[i]->key==findKey)
  86. findValue = csvList[i]->value;
  87. }
  88.  
  89. //Выбор файла .json и открытие в режиме чтения
  90. QString fileName = QFileDialog::getOpenFileName(this, tr("Open .json file"), "", tr(".json (*.json)"));
  91. QFile file(fileName);
  92. file.open(QIODevice::ReadOnly);
  93.  
  94. //Цикл чтения файла
  95. while(!file.atEnd()){
  96.  
  97. //Построчное чтение .json файла и удаление из строки всех пробельных символов
  98. QString findString = file.readLine();
  99. findString.remove(QRegExp("\\s+"));
  100.  
  101. //Если найден нужный тип, переменная будет равна 1
  102. if (findString.contains(findValue)){
  103. matches=1;
  104. }
  105.  
  106. //Если нужный тип найден, начинается обработка строк
  107. else if (matches){
  108.  
  109. //Если при чтении массива находится одиночный символ } - выход
  110. if (findString=="}"){
  111. break;
  112. }
  113.  
  114. //Разбиение строки на слова с отбросом всех символов не слова
  115. auto parts = findString.split(QRegExp("\\W+"), Qt::SkipEmptyParts);
  116.  
  117. //Если в строке менее 2 подстрок - пропуск строки
  118. if (parts.size()<2){
  119. continue;
  120. }
  121.  
  122. //Заполнение массива и текстбраузера значениями
  123. jsonList.append((new myList));
  124. jsonList[k]->key=findKey+"."+parts[0];
  125. jsonList[k]->value=QVariant(offset).toString();
  126. k++;
  127. offset += offsetConvert.value(parts[1]);
  128. ui->textBrowser->append(findKey+"."+parts[0]);
  129. }
  130. }
  131. ui->exportButton->setEnabled(true);
  132. }
  133.  
  134. void MainWindow::on_exportButton_clicked()
  135. {
  136. //Создание файла в корне с программой. Открытие в режиме записи
  137. QFile file("output.xml");
  138. file.open(QIODevice::WriteOnly);
  139. QTextStream writeStream(&file);
  140.  
  141. //Запись всего массива в файл построчно
  142. writeStream << "<root>\n";
  143. for(int i=0;i<jsonList.size();i++){
  144. writeStream << "<item Binding='Introduced'>\n";
  145. writeStream << " <node-path>"+jsonList[i]->key+"</node-path>\n";
  146. writeStream << " <address>"+jsonList[i]->value+"</address>\n";
  147. writeStream << "</item>\n";
  148. }
  149. writeStream << "</root>\n";
  150. file.close();
  151.  
  152. ui->textBrowser->clear();
  153. ui->textBrowser->setText("Done!\n"
  154. "Result saved to output.xml");
  155. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:1:10: fatal error: mainwindow.h: No such file or directory
 #include "mainwindow.h"
          ^~~~~~~~~~~~~~
compilation terminated.
stdout
Standard output is empty