Mit Komma und X separieren



  • Hallo,

    ich würde gerne ein Programm schreiben, was dies tut:
    Es soll eine Datei öffnen.
    In dieser Datei steht ungefähr sowas drin:
    knoten, x, y, z, höhe, preis, breite
    1, 20, 30, 40, 8, 3, 1
    .
    .
    .
    Also es besteht aus einer Zeile mit einer Überschrift (knoten usw.) und darunter den dazugehörigen Zahlen. Die Crux an der Geschichte ist, dass diese Anordnung natürlich auch mal vertauscht sein kann. Also etwa so:
    knoten, höhe, preis, breite, x, y, z

    Ich will es aber so separieren, dass ich eine Datei erstell wo nur das drin steht:
    knoten, x, y, z

    Also müsste mein Programm zuerst die Zeile suchen wo das x ist und dessen stelle bestimmen. Dannach müssten alle folgenden Zeilen so ausgeschlachtet werden, dass die Werte für x y und z in die neue Datei geschrieben wird.

    Das habe ich bis jetzt:

    int main (int argc, char *argv[]) {
    
    const char suche_X[] = ("X");
    const char komma[] = (",");
    int i = 0;
    
    ifstream cfd_csv;
             string csv_line;
    	 cfd_csv.open(argv[1], ios::in);
    	 vector<string> lines; //Vektor erstellen um die ganze Zeile darin zu speichern
    	 while (!cfd_csv.eof())
    	 {
    	    getline(cfd_csv, csv_line);
    	    lines.push_back(csv_line); 
    	    if(csv_line.find(suche_X) != -1) { cout << "X gefunden: " << csv_line << endl; goto ENDE;}
    
    	  }
    ENDE:
    int kommaanzahl = count(csv_line.begin(), csv_line.end(), ',');
    }
    

    Danke



  • huhu,

    ich finde in deinem Post kein einziges Fragezeichen. Es wäre für eine hilfreiche Antwort vielleicht gut, wenn du deine konkreten Fragen deinem Post noch hinzufügen würdest.

    Falls du jetzt dachtest, dass jemand dir eine fertige Lösung programmiert und anschließend auch postet: höchst unwahrscheinlich.



  • Hallo,

    ich dachte die Frage lässt sich aus der Erklärung ablesen. Nun dann eben so:
    Wie kann ich sicherstellen, dass bei veränderbarer Stelle, die X und dann natürlich Y und Z aus dieser Datei separiert werden? Also ich muss zuerst die Stelle mit der Zeile knoten usw. finden, das habe ich. Aber wie geht es weiter wenn ich dann nach knoten , x , y , z aufspallten will?
    Hoffe so verständlicher.
    Danke


  • Mod

    Du musst halt die Überschriften einlesen, diese mit den gesuchten Überschriften vergleichen, dir die Reihenfolge merken (oder zumindest die Positionen, die dich interessieren) und dann die nächste Zeile entsprechend separieren. Aber das wusstest du sicher, denn das ist offensichtlich. Kannst du konkreter werden, was du da dran nicht umsetzen kannst?

    Deine Leselogik ist übrigens fehlerhaft. Erst prüfst du auf Lesefehler, dann liest du, dann verarbeitest du unabhängig von eventuellen Fehlern einfach die Daten.

    Und goto wird im Allgemeinen als schädlich angesehen. Dein Code ist fast ein Lehrbuchbeispiel für Code, der auf den ersten Blick clever aussieht, aber logisch falsch ist, da du selber den Überblick über den Programmfluss verloren hast. Beispielsweise landest du bei einem Lesefehler am Dateiende ebenfalls bei deiner Weiterverarbeitung.



  • Erstmal danke. Also die Zeile mit dem X finde ich mit dem Programm. Das habe ich nicht verstanden:
    "Deine Leselogik ist übrigens fehlerhaft. Erst prüfst du auf Lesefehler, dann liest du, dann verarbeitest du unabhängig von eventuellen Fehlern einfach die Daten."

    Ich gebe zu, dass nicht alles passt in dem Programm. Wie gesagt, ich finde X. Aber dieses X kann je nach unterschiedlicher Datei in unterschiedlichen Spalten stehen. Was ich noch nicht genau kann ist, wie bekomme ich heraus in welcher Spalte sie steht und ziehe alle Werte in der Spalte für X untenstehend mit. Natürlich brauche ich die Werte für Y und Z, wo ich ja weiß dass sie ganau hinter X kommen, auch. Und zum Schluß möchte ich aus vielen Spalten die in sich an unterchiedlichen Spaltenpositionen stehen können, die Spalte knoten, X, Y, Z in eine neue Datei schreiben. Aber erstmal separieren können.

    Danke



  • du sollst zeigen, wie weit du bist und dann eine frage stellen.
    code besser formatiert und mit cpp statt code tags

    nen ansatz von logik sollte man in deinem versuch auch erkennen können.



  • while (!cfd_csv.eof())
    {
        getline(cfd_csv, csv_line);
        lines.push_back(csv_line);
        if(csv_line.find(suche_X) != -1) { cout << "X gefunden: " << csv_line << endl;
    }
    

    sollte eher so aussehen:

    while (getline(cfd_csv, csv_line))
    {
        //...
    }
    

    Ich würde mir mal ganz genau durchlesen, was SeppJ geschrieben hat (insbesondere den 1. Paragraphen). Da steht nämlich alles drin was du brauchst, um dein Problem zu lösen.

    Kleiner Tipp: Du kannst std::getline auch verwenden, um die Zeilen selbst zu separieren (siehe C++ Referenz deines Vertrauens).


Anmelden zum Antworten