Getline跳过最后一个分号(CSV)C ++

时间:2019-02-15 17:47:22

标签: c++ arrays csv vector 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

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

半代表整体的数量。

如果有人可以帮助我,我将非常高兴:)

1 个答案:

答案 0 :(得分:0)

内部循环使用对(+ a b c 6)的调用来决定何时完成对外部调用(require (for-syntax racket/list)) (define-for-syntax (split-literals syntaxes) ;; split a list into literal numbers and the rest (let sloop ([tail syntaxes] [accum/lit '()] [accum/nonlit '()]) (if (null? tail) (values (reverse accum/lit) (reverse accum/nonlit)) (let ([current (first tail)]) (if (number? (syntax-e current)) (sloop (rest tail) (cons (syntax-e current) accum/lit) accum/nonlit) (sloop (rest tail) accum/lit (cons current accum/nonlit))))))) (define-syntax (plus stx) (define +/stx (datum->syntax stx +)) (syntax-case stx () [(_) ;; return additive identity #'0] [(_ a) ;; identity with one argument #'a] [(_ a ...) ;; the interesting case: there's more than one argument: split the ;; arguments into literals and nonliterals and handle approprately (let-values ([(literals nonliterals) (split-literals (syntax->list #'(a ...)))]) (if (null? literals) (if (null? nonliterals) #'0 #`(#,+/stx #,@nonliterals)) (let ([sum/stx (datum->syntax stx (apply + literals))]) (if (null? nonliterals) sum/stx #`(#,+/stx #,@nonliterals #,sum/stx)))))] [_ ;; plus on its own is +, but we want our one. I am not sure this is right +/stx])) 读取的文本字符串的解析。没关系,但是您必须提防外部故障。

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

对于第二行,最后一个getline之后没有文本。在循环的第九次之后,;看不到任何文本,也没有定界符,因此得出结论,它位于输入的末尾。调用失败,仅读取9个输入(而不是预期的10个)后,内部循环退出。