Evgenii Legotckoi
28 августа 2016 г. 21:08

Qt/C++ - Урок 054. Считывание данных из файла CSV и их представление через QStandardItemModel

Содержание

Формат данных CSV ( Comma-Separated Values — значения, разделённые запятыми), является простейшим форматом представления табличных данных. Данный формат поддерживается Excel и многими другими офисными пакетами. Например, я часто сталкиваюсь с данным форматом, когда делаю выгрузку статистики по сайту из панели вебмастера Google Search Console.

В данном формате таблица представляется последовательностью данных, которые разделены запятыми, и представляют собой колонки, а строки разделяются переводом строки. В случае с русифицированным Microsoft Excel данные разделяются точкой с запятой и будут выглядеть следующим образом:

  1. BMW;X5;3000000
  2. Lada;Kalina;250000

Разбор CSV

Таким образом вся задача сводится к построчному считыванию данных из файла и добавления этих данных модель представления данных, которая будет помещена в QTableView .

Возьмём за основу выше приведённый пример содержимого CSV файла, который был создан в Microsoft Excel:

И отобразим его в QTableView через QStandardItemModel:


mainwindow.h

Внешний вид приложения был создан в графическом дизайнере, поэтому к QTableView обращение идёт через объект ui.

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3.  
  4. #include <QMainWindow>
  5. #include <QStandardItemModel>
  6.  
  7. namespace Ui {
  8. class MainWindow;
  9. }
  10.  
  11. class MainWindow : public QMainWindow
  12. {
  13. Q_OBJECT
  14.  
  15. public:
  16. explicit MainWindow(QWidget *parent = 0);
  17. ~MainWindow();
  18.  
  19. private:
  20. Ui::MainWindow *ui;
  21. QStandardItemModel *csvModel; // Объявим указатель на модель данных, которая
  22. // будет содержать данные из CSV файла
  23. };
  24.  
  25. #endif // MAINWINDOW_H

mainwindow.cpp

Файл CSV в данном примере помещён в файл ресурсов проекта, если Вам требуется указать иной файл, то соответственно потребуется переписать путь к данном файлу. Результат будет соответствовать тому, что показан был на скриншоте выше.

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QFile>
  4. #include <QTextStream>
  5. #include <QDebug>
  6.  
  7. MainWindow::MainWindow(QWidget *parent) :
  8. QMainWindow(parent),
  9. ui(new Ui::MainWindow)
  10. {
  11. ui->setupUi(this);
  12. // Создаём модель данных для отображения таблицы из CSV файла
  13. csvModel = new QStandardItemModel(this);
  14. csvModel->setColumnCount(3);
  15. csvModel->setHorizontalHeaderLabels(QStringList() << "Марка" << "Модель" << "Цена");
  16. ui->tableView->setModel(csvModel); // Устанавливаем модель в таблицу
  17.  
  18. // Открываем файл из ресурсов. Вместо данного файла
  19. // необходимо указывать путь к вашему требуемому файлу
  20. QFile file(":/exampleTable.csv");
  21. if ( !file.open(QFile::ReadOnly | QFile::Text) ) {
  22. qDebug() << "File not exists";
  23. } else {
  24. // Создаём поток для извлечения данных из файла
  25. QTextStream in(&file);
  26. // Считываем данные до конца файла
  27. while (!in.atEnd())
  28. {
  29. // ... построчно
  30. QString line = in.readLine();
  31. // Добавляем в модель по строке с элементами
  32. QList<QStandardItem *> standardItemsList;
  33. // учитываем, что строка разделяется точкой с запятой на колонки
  34. for (QString item : line.split(";")) {
  35. standardItemsList.append(new QStandardItem(item));
  36. }
  37. csvModel->insertRow(csvModel->rowCount(), standardItemsList);
  38. }
  39. file.close();
  40. }
  41. }
  42.  
  43. MainWindow::~MainWindow()
  44. {
  45. delete ui;
  46. delete csvModel;
  47. }

Скачать архив с примером csv и QStandardItemModel

Вам это нравится? Поделитесь в социальных сетях!

  • 5 июля 2019 г. 19:04

https://evileg.com/en/post/158/

Also, I would like to get a list of specific column with its items to use it for another function. How can I retrieve it?

TF
  • 20 июля 2021 г. 23:21

А если мне надо данными из файла подписать оси x и y и построить график как это сделать?

Evgenii Legotckoi
  • 11 октября 2021 г. 11:26

Считайте данные из файла и постройте график, например с помощью библиотеки QCustomPlot

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь