CSV Datei mit C++ auswerten



  • Hallo,

    Ich habe eine Excel Tabelle mit zwei Spalten im CSV Format.
    Diese möchte ich in C++ einlesen um etwas mit den Zahlen herumzuspielen.
    Mittelwert Medirian etc.

    Beispiel:
    Spalte 1 Spalte 2
    1 10
    2 20
    3 30
    4 40
    5 50

    Ich habe einen Code programmiert, der die Datei einliest und pro Zeile einen String draus macht.

    Beispiel:

    1;10
    2;20
    3;30
    4;40
    5;50

    Dann habe ich gesagt dass mein Programm alle Semikolons durch Leerzeichen ersetzen soll, damit ich im
    Anschluss über einen Fstream Befehl den einzelnen Werten, eigene Variablen im integer Format zuweisen kann.

    Hierran scheitert es aber.
    Die "Spalte 1" wird korrekt ausgegeben, danach folgt auch ein Leerzeichen, für die Werte in Spalte 2 wird immer nur "0" angezeigt.

    Sprich das möchte ich haben:
    1 10
    2 20
    3 30
    4 40
    5 50

    Das bekomme ich raus:

    1 0
    2 0
    3 0
    4 0
    5 0

    Das Ziel soll es am Ende sein mit den Werten zu "Spielen".
    Die Werte sind Messwerte die nach verschiedenen Verfahren ausgewertet werden sollen um sie mit einem errechneten Ergebnis zu vergleichen.
    Sprich Mittelwert aus dem ersten paar Werten, aus den letzten paar Werten, aus allen Werten.
    Dasselbe mit dem Meridian etc.
    Statistik halt.
    Die Spalte 1 ist im echten Leben auch nur ein Hochzählen des Messwertes (Messwert 1, 2, 3 etc.) die Spalte 2 sind dann die jeweiligen Messwerte.
    Ich habe um die 50 Sätze mit jeweils um die 300 Werte. Deswegen erhoffe ich mir mein Leben durch ein C++ Programm vereinfachen zu können.

    Ich hoffe ich konnte das Interesse des Einen oder Anderen wecken 🙂
    Habt ihr Tipps oder Löungsvorschläge wie ich meinen Code verbessern kann; oder Ideen wie man das ganze eleganter umsetzen könnte?

    Viele Grüße und hier der Code 🙂
    https://pastebin.com/ghYjmkYu



  • @V12TDI sagte in CSV Datei mit C++ auswerten:

    Ich habe einen Code programmiert, der die Datei einliest und pro Zeile einen String draus macht.

    Warum der Umweg.
    Lies direkt aus der Datei.

    Oder enthält die Datei die Semikola (und das erste ist die „Exceltabelle“)?



  • 
    zeile[i] == ' ';
    
    

    Gibt der Compiler da keine Warnung aus?

    Ein Debugger ist sehr hilfreich.



  • @manni66 sagte in CSV Datei mit C++ auswerten:

    
    zeile[i] == ' ';
    
    

    Gibt der Compiler da keine Warnung aus?

    Apropos, warum der Compiler eine Warnung ausgeben sollte, ist mir klar, schließlich soll es eine Zuweisung sein und kein Vergleich.
    Habe mich aber oft gewundert, warum VS19 bei mir niemals, solange es erfolgreich kompiliert, Warnungen ausgibt.
    Dann habe ich obigen Code bei mir mit einer beliebigen Textdatei übersetzen lassen und außer unsinniger Ausgabe keine Warnungen. Auch mit [/Wall]nicht. Erst wenn ich Warnungen als Fehler einstelle, bekomme ich dann die Warnung.
    Ist das richtig so???



  • @zeropage sagte in CSV Datei mit C++ auswerten:

    Ist das richtig so?

    Nein. Bei mir kommt mit /W4 genau die passende Warnung, mit /Wall zusätzlich über 200 nutzlose in systemeigenen Headern.



  • Ok, dann werde ich mal beizeiten einen passenden Thread im Compiler-Unterforum setzen. Danke.



  • @zeropage Die Warnung kann auch „Anweisung ohne Effekt“ sein (oder ähnlich), da das Ergebnis von dem Vergleich verworfen wird.



  • Jepp, aber wie gesagt, solange es kompiliert, bekomme ich einfach keine Warnungen, auch bei obigen Code nicht. Irgendwas kann nicht richtig eingestellt sein.



  • @zeropage
    Und du benutzt tatsächlich den Compiler von MSVC?
    Nimm sscanf, da funktioniert dein Wunsch mit einem Einzeiler:

    if( 2==sscanf(zeile.c_str(),"%d%*c%d",&a,&b) )
        cout << a << b;
    


  • Aha. Bei Deinem Zweizeiler gibt es bei mir nur deswegen eine Warnung, weil er wegen sscanf nicht weitermachen wollte. Und dann habe ich auch die gewünschte Warnung im obigen Code bekommen. Sobald ich wegen sscanf _CRT_SECURE_NO_WARNINGS eingestellt habe, läuft der Zweizeiler, aber ohne Warnungen. Daran liegts vielleicht.

    Meine aber, das gehört in das entsprechende Unterforum.


Anmelden zum Antworten