Загрузка большого текстового файла, Проблемы с загрузкой |
Здравствуйте, гость ( Вход | Регистрация )
Загрузка большого текстового файла, Проблемы с загрузкой |
ALeXUI |
17.12.2012, 23:13
Сообщение
#1
|
Студент Группа: Участник Сообщений: 19 Регистрация: 30.4.2011 Пользователь №: 2647 Спасибо сказали: 2 раз(а) Репутация: 0 |
Здравствуйте, столкнулся со следующей проблемой.
Необходимо загрузить и обработать, большой текстовый файл, примерно 20 мб. И желательно его вывести, например, в qtextedit или что-нибудь подобное. Самы простой вариант дико загружает компьютер:
Подскажиет пожалуйста, как это сделать лучше? Нужно распарсить каждую строчку, там находятся данные, по которым строить графики. |
|
|
Snake174 |
18.12.2012, 4:28
Сообщение
#2
|
Студент Группа: Участник Сообщений: 89 Регистрация: 18.4.2011 Из: Миасс Пользователь №: 2613 Спасибо сказали: 9 раз(а) Репутация: 0 |
Я создавал буфер для содержимого файла char *data = new char[ file_size ], читал в него содержимое и в QTextEdit выводил только ту часть, которая видна в данный момент. Если в QTextEdit влазит, например 20 строк, то зачем показывать все остальные. Это как при программировании графики, когда нужно отсекать то, что не попадает в камеру, чтобы лишнее не рисовалось. Файлы были размером до 200 Мб и всё летало. Я так понял дико загружает компьютер то, что в QTextEdit постоянно грузятся данные и Qt пытается всё это перерисовывать.
Сообщение отредактировал Snake174 - 18.12.2012, 4:31 |
|
|
_Vitaliy_ |
18.12.2012, 10:24
Сообщение
#3
|
Студент Группа: Участник Сообщений: 59 Регистрация: 20.11.2008 Пользователь №: 428 Спасибо сказали: 3 раз(а) Репутация: 0 |
Все зависит от того, какого рода содержимое файла. Если это к примеру данные, структура которых повторяется в каждой строке то считывается строка, затем парсится и записывается в например в модель. Если это Вам подходит то могу скинуть часть кода (если сами не разберетесь).
|
|
|
ALeXUI |
18.12.2012, 12:34
Сообщение
#4
|
Студент Группа: Участник Сообщений: 19 Регистрация: 30.4.2011 Пользователь №: 2647 Спасибо сказали: 2 раз(а) Репутация: 0 |
Цитата Если в QTextEdit влазит, например 20 строк, то зачем показывать все остальные. Это как при программировании графики, когда нужно отсекать то, что не попадает в камеру, чтобы лишнее не рисовалось. Не могли бы привести кучовек кода, не могу понять, как это реализовать?) Но идея мне нравиться) Цитата Все зависит от того, какого рода содержимое файла. Если это к примеру данные, структура которых повторяется в каждой строке то считывается строка, затем парсится и записывается в например в модель. Если это Вам подходит то могу скинуть часть кода (если сами не разберетесь). Да так и есть, структура повторяется в каждой строчке. Буду очень благодарен за пример кода) |
|
|
Snake174 |
18.12.2012, 12:59
Сообщение
#5
|
Студент Группа: Участник Сообщений: 89 Регистрация: 18.4.2011 Из: Миасс Пользователь №: 2613 Спасибо сказали: 9 раз(а) Репутация: 0 |
Создаёшь скроллбар, ставишь его рядом с QTextEdit-ом:
Раскрывающийся текст
encodedData - массив QByteArray У QTextEdit-a делаешь: setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); Ну что-то типа этого у меня было. |
|
|
_Vitaliy_ |
18.12.2012, 19:54
Сообщение
#6
|
Студент Группа: Участник Сообщений: 59 Регистрация: 20.11.2008 Пользователь №: 428 Спасибо сказали: 3 раз(а) Репутация: 0 |
У меня данные в строке разделялись как минимум одним пробелом. Если у Вас это так, то действовать можно по следующему алгоритму.
1. в *.h пишем: QStandardItemModel *model; 2. в *.cpp в конструкторе: model = new QStandardItemModel(this); 3. здесь привожу часть своего рабочего кода (некоторые "вещи" опущены) главное уловить смысл Раскрывающийся текст int currentRow = 0; QCoreApplication::processEvents(); // chtobi prilozhenie ne zavisal QStandardItem *item = 0; while (!stream.atEnd()) { fields = stream.readLine().simplified().split(' '); // razdelitel !!! for (int i = 0; i < columnCount; ++i) { item = new QStandardItem(fields.at(i)); model->setItem(currentRow, i, item); } ++currentRow; } 4. далее по коду, например у меня это было отдельное окно Раскрывающийся текст QDialog *dialog = new QDialog(this); dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->setWindowTitle("Data ..."); ... QTableView *view = new QTableView(dialog); /// QTableView (&dialog) view->setModel(model); ... dialog->show(); удобно тем, что данные хранятся в модели, а с моделью довольно просто работать. |
|
|
ALeXUI |
13.2.2013, 11:00
Сообщение
#7
|
Студент Группа: Участник Сообщений: 19 Регистрация: 30.4.2011 Пользователь №: 2647 Спасибо сказали: 2 раз(а) Репутация: 0 |
Vitaliy, огромное Вам спасибо, вернулся к этой задаче, и все получилось очень здорово!
|
|
|
Гость_Гость_* |
13.9.2013, 9:20
Сообщение
#8
|
Гости |
Я создавал буфер для содержимого файла char *data = new char[ file_size ], читал в него содержимое и в QTextEdit выводил только ту часть, которая видна в данный момент. Если в QTextEdit влазит, например 20 строк, то зачем показывать все остальные. Это как при программировании графики, когда нужно отсекать то, что не попадает в камеру, чтобы лишнее не рисовалось. Файлы были размером до 200 Мб и всё летало. Я так понял дико загружает компьютер то, что в QTextEdit постоянно грузятся данные и Qt пытается всё это перерисовывать. Не так уж и летает! Реализовал Ваш алгоритм. Если просматривать файл в 200 Mb, то конец файла очень медлительный. Это и не удивительно - так как постоянно приходится проходить весь файл при вычислении значения pos |
|
|
Snake174 |
16.9.2013, 5:58
Сообщение
#9
|
Студент Группа: Участник Сообщений: 89 Регистрация: 18.4.2011 Из: Миасс Пользователь №: 2613 Спасибо сказали: 9 раз(а) Репутация: 0 |
Я создавал буфер для содержимого файла char *data = new char[ file_size ], читал в него содержимое и в QTextEdit выводил только ту часть, которая видна в данный момент. Если в QTextEdit влазит, например 20 строк, то зачем показывать все остальные. Это как при программировании графики, когда нужно отсекать то, что не попадает в камеру, чтобы лишнее не рисовалось. Файлы были размером до 200 Мб и всё летало. Я так понял дико загружает компьютер то, что в QTextEdit постоянно грузятся данные и Qt пытается всё это перерисовывать. Не так уж и летает! Реализовал Ваш алгоритм. Если просматривать файл в 200 Mb, то конец файла очень медлительный. Это и не удивительно - так как постоянно приходится проходить весь файл при вычислении значения pos Ты бы ещё лет через 5 ответ написал. К тому же _Vitaliy_ предложил отличный вариант, сделал также, всем доволен. |
|
|
Текстовая версия | Сейчас: 23.11.2024, 6:46 |