Russian Qt Forum

Qt => Вопросы новичков => Тема начата: gal555 от Апрель 26, 2018, 09:05



Название: чем из QT заменить getline с сепаратором?
Отправлено: 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 стрим с сепаратором


Название: Re: чем из QT заменить getline с сепаратором?
Отправлено: qate от Апрель 26, 2018, 15:29
Наверно задача не частая, поэтому можно накостылять типа https://stackoverflow.com/questions/27838186/qtextstream-read-a-string-until-tab

Неужели файл очень большой, что не считать его целиком ?


Название: Re: чем из QT заменить getline с сепаратором?
Отправлено: gal555 от Апрель 26, 2018, 16:15
Спасибо. В принципе годится "костыль", задача раз в неделю json файл разобрать в несколько метров. redall не берёт. главное - чтоб работало . Я думал может пропустил метод какой стримовский, вот и спросил.


Название: Re: чем из QT заменить getline с сепаратором?
Отправлено: Авварон от Апрель 26, 2018, 17:17
чем QFile::readLine не угодил?


Название: Re: чем из QT заменить getline с сепаратором?
Отправлено: Old от Апрель 26, 2018, 18:25
Еще более непонятно, зачем для разбора json  читать файл построчно? И это если забыть про QJsonDocument. :)


Название: Re: чем из QT заменить getline с сепаратором?
Отправлено: Авварон от Апрель 26, 2018, 18:56
Говорят, файл большой. Но я бы попробовал сделать QFile::mmap->QByteArray::frmRawData->QJsonDocument::fromJson сперва


Название: Re: чем из QT заменить getline с сепаратором?
Отправлено: gal555 от Апрель 26, 2018, 22:14
Не надо сразу гнобить. Новичек, вот и прошу научить.
1) QJsonDocument как не пробовал -не смог создать. на этом шаге комп вис. Файл присылают  текстовый несколько метров (от посторонних, переделать их заставить нельзя). Делал маленький файл - всё работало.
2) QFile::readLine - если можно задать сепаратор - как раз это я и спрашиваю. Сам не нашёл как. Пробелов и окончаний строк - нет, всё одной строкой
 


Название: Re: чем из QT заменить getline с сепаратором?
Отправлено: Авварон от Апрель 27, 2018, 01:14
1) Протестил на 13мегабайтном json'е, ~400ms, около половины времени - вывод в консоль. Файл сгенерил тут (https://www.json-generator.com) (поставил repeat 10k-15k), код тут (https://pastebin.com/R5dGftDx). Макось, core i7, ssd, релиз. 400ms это ниачом вообще. 180 мегабайт QJsonDocument уже не читает. Какой у вас размер файла?
2) А, я слепой, надо до запятой читать


Название: Re: чем из QT заменить getline с сепаратором?
Отправлено: Igors от Апрель 27, 2018, 09:51
А по-народному читать сырые данные напр чанками по 4K и перегонять в строку? Не, ну там же надо написать десяток строк (позорный велик!!!)  Поэтому "будем изыскивать"  :)


Название: Re: чем из QT заменить getline с сепаратором?
Отправлено: gal555 от Апрель 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();
       }