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
没有看到任何文本和分隔符,因此它得出结论,它位于输入的末尾。调用失败,内部循环在仅读取九个输入而不是预期的十个输入后退出。
我有一个非常大的 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
没有看到任何文本和分隔符,因此它得出结论,它位于输入的末尾。调用失败,内部循环在仅读取九个输入而不是预期的十个输入后退出。