Ignorieren von bestimmen Strings beim einlesen einer Textdatei



  • Hallo Community,

    ich habe ein Problem bei dem sortieren einer Textdatei über C++ in Visual Studio. Ich versuche eine Textdatei über den Befehl "getline" in einer "while" Schleife einzulesen und in einen "vector" zu schreiben. Dabei möchte ich gewisse Zeilen des Dokuments ignorieren und nur die restlichen neu speichern. Beispiel der ungewollten Strings: "Nicht abgestimmt". Kann mir jemand helfen mit welchem Befehl ich diese "ignorieren" kann, sodass sie nicht in dem "vector" gespeichert werden.

    Ps: Bin absoluter Neuling und kein Informatikgenie.....

    Im voraus schonmal vielen Dank!!



  • Vergleiche einfach den String:

    if (str != "Nicht abgestimmt")
        vec.push_back(str);
    

    PS: Bei mehreren Strings mittels && die Vergleiche durchführen.



  • Danke erstmal für die schnelle Antwort, allerdings markiert er mir nun die push_back Funktion und leider helfen mir diese Fehlermeldungen so so gut wie nie....
    Kann mir der Fehler eventuell erklärt werden?
    Über C++ ist leider so gut wie nichts für Anfänger verständliches zu finden......

    Hier der Code:
    vector<textdatei> Daten(string filename)
    {
    vector<textdatei> Ergebnis;

    string zeile;							// Zeichenketten (strings) deklarieren: "zeile" und "text"
    
    textdatei text;
    
    
    
    ifstream Eingabe(filename);					// Einlesestrom öffnen, Textdatei "Auswahl_WPM.txt" einlesen
    
    if (!Eingabe)
    {
    	printf("Die Datei konnte nicht gefunden werden oder wurder falsch geschrieben!");		//Wenn die Datei nicht gefunden werden konnte, wird diese Meldung ausgegeben
    	system("pause");
    }
    //Falls Datei gefunden wird hier fortgesetzt
    
    
    while (getline(Eingabe, zeile))				// while-Schleife definieren, Schleifen-Bedingung: Ausführung solange Zeichenkette eingelesen wird 
    											//(mit Einlesestrom "input" und Zeichenkette "zeile")
    {
    
    	if ((zeile != "Nicht abgestimmt") || (zeile != "Nicht abgestimmt"))
    	{
    	Ergebnis.**push_back**(zeile);
    	}
    
    	Ergebnis.push_back(text);
    }
    
    Eingabe.close();
    
    return Ergebnis;
    

    }

    Grüße.



  • Was soll denn textdatei für ein Datentyp sein?
    Warum benutzt du nicht string?

    PS: Schau dir mal die Linkliste an, um einen guten Einstieg in C++ zu erhalten.



  • @SaturnsHyperion

    Wenn ich das richtig sehe, hast du einen vector<textdatei> und versucht da seinen string rein zu schieben. Das geh nicht, du brauchst einen vector<string> um die Strings da rein zu schreiben.



  • Entschuldigt die Verwirrung, aber ich habe über dem vector "textatei" in einem struct als String definiert, welcher aus mehreren Strings besteht.

    struct textdatei
    {
    string Student;
    string Modul;
    };

    Grüße.

    Ps: die doppelten Sternchen an dem push_back sollten nicht sein.



  • Aber es bleibt dabei: Du kannst einen string nicht in einen vector<textdatei> schieben, string und textdatei sind unterschiedliche Typen.



  • Neben dem, was die anderen schon zu deinem vector gesagt haben:

    @SaturnsHyperion sagte in Ignorieren von bestimmen Strings beim einlesen einer Textdatei:

    if ((zeile != "Nicht abgestimmt") || (zeile != "Nicht abgestimmt"))

    Was soll das denn? Du vergleich 2x mit demselben String? Falls du hier unterschiedliche Strings meinen solltest, dann wäre die Bedingung immer true. Überdenke also nochmal deine Logik. Ich nehme an, dass du eigentlich && statt || verwenden wolltest.

    Und wozu noch das Ergebnis.push_back(text); - was soll das überhaupt tun?



  • Wenn deine Zeile aus 2 Wörtern besteht, so müßtest du diese erst ermitteln, bevor du den Vector damit füllst.
    Gibt es ein spezielles Trennzeichen oder dürfen weder Student noch Modul ein Leerzeichen (Space) enthalten?



  • Ja, stimmt, ich wollte nicht zweimal nach dem gleiche prüfen. Der zweite Ausdruck sollte "abgestimmt" enthalten, sodass diese beiden Zeilen, falls erkannt, ausgelassen werden.
    Ich hatte die erste Antwort von @Th69 so verstanden, dass dies angepasst an meinen Code wäre und so funktionieren könnte, da bei Ihm ja nur allgemein mit "vec.", "str" bezeichnet.

    Wie gesagt, ich kann leider überhaupt nicht mit dem Thema und hätte gern eine andere (leichtere) Sprache gelernt.

    Grüße.



  • @Th69 Es handelt sich um ca. 450 Zeilen, welche abwechselnd mit den zu ignorierenden Begriffen oder mit einem Modul und einem Studenten gefüllt sind. Das Modul und den Studenten versuche ich dadurch zu extrahieren, indem ich nach dem ersten Char und dem trennenden Leerzeichen suche und somit über die Funktion substr diese trenne. Anschließend tausche ich das Leerzeichen gegen ein Semikolon. So kann ich dann jedenfalls gedacht, diese dann getrennt voneinander in SQLite in Tabellen einfügen.

    Grüße.



  • Du meinst die Textdatei sieht in etwa so aus:

    Abgestimmt
    Student1 Modul1
    Nicht abgestimmt
    Student2 Modul2
    Abgestimmt
    Student3 Modul3
    ...
    

    ?
    Und du möchtest jeweils nur die Zeile unter "Abgestimmt" in den Vector übernehmen?

    Dann lese jeweils zwei Zeilen ein und führe dann das Extrahieren und Hinzufügen zum Vector aus:

    string zeile1, zeile2;
    while (getline(Eingabe, zeile1) && getline(Eingabe, zeile2))
    {
        if  (zeile1 == "Abgestimmt") // oder != "Nicht abgestimmt"
        {
            textdatei t; // textdatei ist ein blöder Name für die Struktur, besser wäre TabellenEintrag (bzw. DataEntry o.ä).
    
            // todo: extrahieren der Zeile zeile2 und Zuweisen zu ...
            t.Student = ...;
            t.Modul = ...;
            Ergebnis.push_back(t);
        }
    }
    

    PS: Bei Leerzeichen als Trenner kann man auch einfach direkt aus der Eingabe lesen:

    Eingabe << t.Student << t.Modul;
    

    (und dann && getline(Eingabe, zeile2) im Code oben löschen)
    Nur das mit dem Semikolon verstehe ich nicht...


Log in to reply