Getline 跳过最后一个分号 (csv) c++

Getline skips last semicolon (csv) c++

我有一个非常大的 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

当我现在开始 运行 我的程序时,它从第 3 行获取“5698”作为第 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;
    }

Semi代表整件的数量。

如果有人能帮助我,我会很高兴:)

内部循环使用对 getline 的调用来决定它何时完成对外部调用 getline 读取的文本字符串的解析。没关系,但你必须提防无关的故障。

第一行,内循环运行十次;每个以 ; 结尾的字段一次,再读一次以阅读剩余的文本。

第二行,最后;后没有文字。在循环第九次后,getline 没有看到任何文本和分隔符,因此它得出结论,它位于输入的末尾。调用失败,内部循环在仅读取九个输入而不是预期的十个输入后退出。