Russian Qt Forum

Qt => Вопросы новичков => Тема начата: test0 от Декабрь 09, 2011, 15:18



Название: Нарисовать график по данным из файла
Отправлено: test0 от Декабрь 09, 2011, 15:18
Доброго времени суток!

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

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

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

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


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

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

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

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

п.с. Работать программе предстоит в винде, поэтому возможно надо поставить Qt под винду?


Название: Re: Нарисовать график по данным из файла
Отправлено: madRoger от Декабрь 09, 2011, 15:36
Последовательность действий верна, а для работы с графиками подойдет qwt


Название: Re: Нарисовать график по данным из файла
Отправлено: test0 от Декабрь 09, 2011, 21:17
Спасибо за наводку на qwt!

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

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

Особые сложности могут быть при выводе данных из массива на график... не будет ли тормозить, например, при выводе более 100К значений за раз или надо порциями?


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

Выводить можно полностью, но будет задержка, можно порциями, но это немного сложнее в плане программирования. Тут все зависит от задачи. Можно выводить полностью и во время обсчета массива показывать прогрессбар с процессом загрузки.


Название: Re: Нарисовать график по данным из файла
Отправлено: test0 от Декабрь 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"
... и т.д.


Название: Re: Нарисовать график по данным из файла
Отправлено: kuzulis от Декабрь 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(), т.к. у тебя куча запятых в строке.
Надо было структуру файла нормально придумывать, чтобы если
разделитель - то уникальный, например ';'


Название: Re: Нарисовать график по данным из файла
Отправлено: kambala от Декабрь 10, 2011, 13:30
ну так разделять по "\",\"" и потом у полученных строк удалять кавычки или вырезать только строку-число для конвертации. но да, лучше конечно, чтоб разделитель элементов и целой/дробной части не совпадали.


Название: Re: Нарисовать график по данным из файла
Отправлено: madRoger от Декабрь 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);


Название: Re: Нарисовать график по данным из файла
Отправлено: test0 от Декабрь 12, 2011, 18:36
Спасибо за советы, попробую!
А структура файла такая, потому что ее такой делает прибор, изменять который увы нельзя)