По сути, вам нужно только разделить вашу строку:
QStringList delimited = line.split(" ");
QString town = delimited[2];
чтобы получить Теттау или Шипкау в вашем примере, аналогично с другими предметами.
Тем не менее, я не уверен насчет «Schipkau Hörlitz» в вашем примере, если предположить, что это название одного города или квартала города с составным названием. Это зависит от вашего формата. Один из вариантов - начать с индекса 2 и добавить все, что придет, если только это не название немецкого государства. Конечно, тогда это будет работать только для Германии. Вы также можете попытаться найти следующий индекс, состоящий только из цифр, в вашем примере «00» и вернуться к этому. Опять же, зависит от вашего формата, и я надеюсь, что дал вам достаточно для работы.
Может выглядеть так:
QStringList delimited = line.split(" ");
QString town = delimited[2];
size_t pos = 3;
while(not is_german_state(delimited[pos]))
{
town += " " + delimited[pos];
pos++;
}
QString longitude = delimited[pos+6];
QString latitude= delimited[pos+7];
(Обратите внимание, что я не уловил случай, когда строка неправильно отформатирована и, таким образом, разделена [pos] или значения для долготы или широты могут привести к ошибке сегментации, если нет.)
После этого вы каким-то образом сохраняете его, например, vector<TownData>
со структурой TownData
, в которой хранятся нужные вам данные, и на каждой итерации вы добавляете вектор. Я предполагаю, что как это сделать, понятно, но спросите, не так ли.
В общем, в Qt стоит посмотреть, какие классы вы используете в данный момент. В этом случае, QString
, который имеет много функций.
Поскольку вектор копируется, когда он меняет размер резервирования, а вы, в частности, спрашиваете об эффективности, было бы неплохо зарезервировать достаточно места для вектора, прежде чем вводить итерации. Я не знаю ни одного метода для получения количества строк в файле без их фактической итерации, поэтому вам может потребоваться сделать это один раз, прежде чем вы на самом деле будете работать с данными в нем, или вам нужно будет создать некоторую оценщику Например, оцените строки по размеру файла или оцените его как 16k. Затем позвоните vector::reserve(size_type n)
на ваш вектор. Тем не менее, 16k строк звучат не так много, возможно, это преждевременная оптимизация. Я бы, наверное, сначала обошелся без резервирования и просто посмотрел, работает ли он без сбоев.