Russian Qt Forum
Июнь 10, 2024, 15:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Нарисовать график по данным из файла  (Прочитано 7641 раз)
test0
Гость
« : Декабрь 09, 2011, 15:18 »

Доброго времени суток!

Прошу помощи в освоении Qt и в частности решения одной задачи:

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

- Сам файл это CSV, правда большой (более 100000 строк)
- Значение надо получить из строки, потом конвертнуть из HEX в DEC. Потом его можно использовать.
- Построить график (по оси У: значение из файла, по оси Х: номер строки).

У меня Qt установлена на Ubuntu. Версия Qt как я понимаю последняя.


Собственно я пытался это реализовать другими средствами, а потом узнал о Qt и мне понравилось. Начал же я с обработки строк файла и создания регулярного выражения. Сейчас я его уже проверил и файл можно разбирать как обычный текстовой.

Но с чего начать и как лучше не знаю. Прошу направить на верный путь!

Собственно последовательность действий я вижу такую:

1) Открываем файл
2) Обрабатываем построчно
3) Данные записываем в массив
4) Создаем график
5) Выводим данные из массива

п.с. Работать программе предстоит в винде, поэтому возможно надо поставить Qt под винду?
« Последнее редактирование: Декабрь 09, 2011, 15:21 от test0 » Записан
madRoger
Гость
« Ответ #1 : Декабрь 09, 2011, 15:36 »

Последовательность действий верна, а для работы с графиками подойдет qwt
Записан
test0
Гость
« Ответ #2 : Декабрь 09, 2011, 21:17 »

Спасибо за наводку на qwt!

А по остальным частям задачки можете посоветовать?

Просто с нуля разбираюсь)

Особые сложности могут быть при выводе данных из массива на график... не будет ли тормозить, например, при выводе более 100К значений за раз или надо порциями?
Записан
madRoger
Гость
« Ответ #3 : Декабрь 09, 2011, 21:56 »

Тормоза конечно будут, но не при выводе на график, а при чтении массива из файла и его разборе.
График из 100К значений представляется просто пятном на экране. Если разрешение монитора по горизонтали 1024, то на графике будет примерно 100 значений на 1 пиксель. Вряд ли получится что-то рассмотреть. Можно брать среднее с каждых 10 значений, тогда получится график из 1000 значений, это думаю подойдет, или другие варианты.

Выводить можно полностью, но будет задержка, можно порциями, но это немного сложнее в плане программирования. Тут все зависит от задачи. Можно выводить полностью и во время обсчета массива показывать прогрессбар с процессом загрузки.
Записан
test0
Гость
« Ответ #4 : Декабрь 10, 2011, 00:47 »

Вот нашёл код по разбору файла построчно:

Код:
#include <QFile>
#include <QTextStream>

static void process_line(const QByteArray &)
{
}

static void process_line(const QString &)
{
}

int main()
{
    QFile file("modules");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return 1;

    QTextStream in(&file);
    QString line = in.readLine();
    while (!line.isNull()) {
        process_line(line);
        line = in.readLine();
    }
}

А как сделать обработку читаемой строки по регулярке и преобразованием из hex в dec перед тем как его запоминать? Или я не в ту степь двигаюсь?
И как я понял в данном случае код не запоминает строки в массив, а как это правильно сделать?
Регулярное выражение у меня такое вышло: /(\w{2}).{4}\$/
А примерные строки из файла:

"-1296418983,27","0x0005C906"
"-1296418983,27","0x000571F1"
"-1296418983,27","0x00050042"
"-1296418983,27","0x0005229D"
"-1296418983,27","0x00058101"
"-1296418983,27","0x00053FE3"
"-1296418983,27","0x000533B1"
"-1296418983,27","0x00056AD2"
"-1296418983,27","0x00050759"
... и т.д.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Декабрь 10, 2011, 11:00 »

Цитировать
А как сделать обработку читаемой строки по регулярке и преобразованием из hex в dec перед тем как его запоминать? Или я не в ту степь двигаюсь?
см. в сторону методов типа QString::toXXX()

Да и зачем регулярка в этом случае?
Можно просто делать что-то типа:
Код
C++ (Qt)
...
QString line = <твоя строка>
QStringList list = line.split(",");
...
float value1 = list.at(0).toFloat();
int value2 = list.at(1).toInt(16);
...
 

Как то так. Не уверен в производительности этого метода.
Но это при условии что в тех строках что ты привел нет символов " (кавычек).
Если есть кавычки, можно попробовать сдеать типа:
Код
C++ (Qt)
...
list.at(0).remove("\"").toXXX
...
 

Попробуй, может получится.

ЗЫ: А, не, не получится split(), т.к. у тебя куча запятых в строке.
Надо было структуру файла нормально придумывать, чтобы если
разделитель - то уникальный, например ';'
« Последнее редактирование: Декабрь 10, 2011, 11:10 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #6 : Декабрь 10, 2011, 13:30 »

ну так разделять по "\",\"" и потом у полученных строк удалять кавычки или вырезать только строку-число для конвертации. но да, лучше конечно, чтоб разделитель элементов и целой/дробной части не совпадали.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
madRoger
Гость
« Ответ #7 : Декабрь 10, 2011, 15:37 »

При такой структуре данных можно такой вариант попробовать:
Код:
QString line = исходная строка;
line.remove("\"");
int pos = line.lastIndexOf(",");
if(pos <= 0)
{ Ошибка
}
float f = line.left(pos).toFloat();
int i = line.right(line.lenght()-pos-1).toInt(16);
Записан
test0
Гость
« Ответ #8 : Декабрь 12, 2011, 18:36 »

Спасибо за советы, попробую!
А структура файла такая, потому что ее такой делает прибор, изменять который увы нельзя)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.128 секунд. Запросов: 19.