Getline пропускает последнюю точку с запятой (CSV) C ++ - PullRequest
0 голосов
/ 15 февраля 2019

У меня действительно большой CSV-файл с 10 значениями, разделенными запятыми в каждой строке, в конце каждой строки есть \ n.

Теперь у меня есть строка с точками с запятой.Количество значений соответствует количеству значений, разделенных запятыми, в других строках

5696;Neusser Strasse;49;1;50670;Neustadt-Nord;18.09.1990;um;1890;Wohn- u. Geschäftshaus
;;;;;;;;;
5698;Richard-Wagner-Strasse;18;1;50674;Neustadt-Süd;18.09.1990;;1905;Wohnhaus

Когда я сейчас запускаю свою программу, она получает «5698» из 3-й строки как последнее значение2-я строка, вот что я получаю:

0 Denkmalnummer: 5696
1 Strasse: Neusser Strasse
2 Nummer: 49
3 Bezirk: 1
4 PLZ: 50670
5 Ort: Neustadt-Nord
6 unter Schutz: 18.09.1990
7 Baujahr Zusatz: um
8 Baujahr: 1890
9 Kurzbezeichnung: Wohn- u. Geschäftshaus

****************

0 Denkmalnummer: 
1 Strasse: 
2 Nummer: 
3 Bezirk: 
4 PLZ: 
5 Ort: 
6 unter Schutz: 
7 Baujahr Zusatz: 
8 Baujahr: 
9 Kurzbezeichnung: 5698

****************
0 Denkmalnummer: Richard-Wagner-Strasse
1 Strasse: 18
2 Nummer: 1
3 Bezirk: 50674
4 PLZ: Neustadt-S├╝d
5 Ort: 18.09.1990
6 unter Schutz: 
7 Baujahr Zusatz: 1905
8 Baujahr: Wohnhaus
9 Kurzbezeichnung: 5699

Это продолжается и портит правильное выравнивание данных.

Мой основной код выглядит так (через getline данные файлахранится в векторе):

if (denkmallist.is_open()) {
    if (counter < 1) {
        while (getline(denkmallist, line)) {
            stringstream ss(line);
            while (getline(ss, line, ';')) {
                ausgelesenes.push_back(line);
                counter++;
                daten.push_back(ausgelesenes);
                ausgelesenes.clear();
            }
        }
    }
    else{
        while (getline(denkmallist, line)){
            ausgelesenes.push_back(line);
        }
        daten.push_back(ausgelesenes);
        ausgelesenes.clear();
    }
}

и код, который затем отображает результаты, выглядит следующим образом:

for(int x=0, y=semis; x<=semi2+2, y<daten.size(); x++, y++){
        if (x > semi2-1){
            x = 0;
            cout << '\n' << "****************" << '\n' << endl;
        }
        cout << x << " " << daten[x][0] << ": " << daten[y][0] << endl;
    }

Полу представляет количество единиц.

Iбыл бы очень рад, если бы кто-то мог помочь мне:)

1 Ответ

0 голосов
/ 15 февраля 2019

Внутренний цикл использует вызов к getline, чтобы решить, когда он завершит анализ текстовой строки, которая была прочитана внешним вызовом к getline.Это нормально, но вы должны остерегаться посторонних сбоев.

Для первой строки внутренний цикл выполняется десять раз;один раз для каждого поля, заканчивающегося ;, и еще раз для чтения оставшегося текста.

Для второй строки после последней ; нет текста.После девятого цикла, getline не видит текста и разделителя, поэтому приходит к выводу, что он находится в конце ввода.Вызов завершается неудачно, и внутренний цикл завершается после чтения только девяти входов вместо ожидаемых десяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...