Getline跳过最后一个半隆(CSV)C

Getline skips last semicolon (csv) c++

本文关键字:CSV 最后一个 Getline      更新时间:2023-10-16

我有一个非常大的csv文件,每行的逗号分开为10个,在每行的末端为a 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",所以我得到的是:

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;
    }

半度代表整体的数量。

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

内部循环使用对getline的调用来决定何时完成由外部调用 getline读取的文本字符串。没关系,但是您必须提防无关的失败。

对于第一行,内部循环运行十次;一次以;结尾的每个字段,再一次读取其余文本。

对于第二行,上次;之后没有文本。第九次通过循环后,getline看不到文本,也没有定界符,因此它得出结论是在输入的末尾。呼叫失败,内部循环仅读取九个输入而不是预期的十个。