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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: чем из QT заменить getline с сепаратором?  (Прочитано 5799 раз)
gal555
Гость
« : Апрель 26, 2018, 09:05 »

Подскажите в Qt чем можно заменить (Qtшными библиотеками):

Код:
std::ifstream file(strFile.toStdString()); // файл из которого читаем в папке проекта 
std::string s;                             // сюда будем класть считанные строки
while (!file.eof()) {                      // условие на окончание файла
std::getline(file, s, '"');                // считываем до кавычек
                                           //потом передаём для обработки
}
нужно для парсинга большого файла, памяти не хватает целиком считать, а записан одной строкой(json ответ с сайта). всё остальное написал Qt, не хочу смешивать и найти не могу.
Нужен какой либо Qt стрим с сепаратором
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #1 : Апрель 26, 2018, 15:29 »

Наверно задача не частая, поэтому можно накостылять типа https://stackoverflow.com/questions/27838186/qtextstream-read-a-string-until-tab

Неужели файл очень большой, что не считать его целиком ?
Записан
gal555
Гость
« Ответ #2 : Апрель 26, 2018, 16:15 »

Спасибо. В принципе годится "костыль", задача раз в неделю json файл разобрать в несколько метров. redall не берёт. главное - чтоб работало . Я думал может пропустил метод какой стримовский, вот и спросил.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #3 : Апрель 26, 2018, 17:17 »

чем QFile::readLine не угодил?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #4 : Апрель 26, 2018, 18:25 »

Еще более непонятно, зачем для разбора json  читать файл построчно? И это если забыть про QJsonDocument. Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #5 : Апрель 26, 2018, 18:56 »

Говорят, файл большой. Но я бы попробовал сделать QFile::mmap->QByteArray::frmRawData->QJsonDocument::fromJson сперва
Записан
gal555
Гость
« Ответ #6 : Апрель 26, 2018, 22:14 »

Не надо сразу гнобить. Новичек, вот и прошу научить.
1) QJsonDocument как не пробовал -не смог создать. на этом шаге комп вис. Файл присылают  текстовый несколько метров (от посторонних, переделать их заставить нельзя). Делал маленький файл - всё работало.
2) QFile::readLine - если можно задать сепаратор - как раз это я и спрашиваю. Сам не нашёл как. Пробелов и окончаний строк - нет, всё одной строкой
 
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #7 : Апрель 27, 2018, 01:14 »

1) Протестил на 13мегабайтном json'е, ~400ms, около половины времени - вывод в консоль. Файл сгенерил тут (поставил repeat 10k-15k), код тут. Макось, core i7, ssd, релиз. 400ms это ниачом вообще. 180 мегабайт QJsonDocument уже не читает. Какой у вас размер файла?
2) А, я слепой, надо до запятой читать
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Апрель 27, 2018, 09:51 »

А по-народному читать сырые данные напр чанками по 4K и перегонять в строку? Не, ну там же надо написать десяток строк (позорный велик!!!)  Поэтому "будем изыскивать"  Улыбающийся
Записан
gal555
Гость
« Ответ #9 : Апрель 27, 2018, 11:59 »

Спасибо всем. В итоге через QString QTextStream :: readLine без сепараторов считалось всё. Даже на куски не делил. Если в консоль не выводить, а с обработкой в базу данных отправлять - летает.
Код:
       QFile file (strFile);
       QString str;
       if(file.open(QIODevice::ReadOnly))
       {
           QTextStream stream(&file);

           while (!stream.atEnd())
           {
               str = stream.readLine();
//               qDebug() << str;
           }
           if(stream.status()!= QTextStream::Ok)
           {
               qDebug() << "Ошибка чтения файла";
           }
           file.close();
       }
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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