Text-Datei zeilenweise ordnen
-
Hallo,
Ich will ein Programm schreiben, das aus einer Text-Datei Zeilen einliesst und bearbeitet.
Die Datei ist so aufgebaut: mehrere Spalten "Daten" und eine Spalte "Size" (beides double-Zahlen).
Die sog. Spalten sind mit ';' getrennte Zahlen (Excell-Format).
Die Datei hat ca an die 60 000 Zeilen.Was ich will:
1. Ich will die Zeilen der Datei nach dem Wert "Size" zB absteigend anordnen und alle Zeilen deren "Size" < "Minimum" ist wegloeschen und nicht weiter bearbeiten (danach bleiben ca immer noch 40 000 Zeilen uebrig).
2. Ich will den groessten Wert aus Daten finden.
3. Dann will ich mit diesem groessten Wert alle Daten normieren (== eine Berechnung durchfuehren).Meine Fragen:
1. Wie sortiert man so eine Datei zeilenweise? Kann man alles in eine Riesenliste/vector einlesen oder fliegt mir dann auf Grund des Speicherbedarfs alles um die Ohren, wenn ich da dann ne Sortierfunktion drueberlaufen lassen will? Welche Datenstruktur waere fuer so etwas geeignet in C++?2. Ich habe mir ueberlegt das in genau der oben beschriebenen Reihenfolge der Schritte durchzufuehren, da ich zuerst die Menge der Zeilen dezimiert haben will bevor ich nach der groessten Zahl suche.
Auch kann ich kann erst alle Werte berechnen, wenn ich die groesste Zahl gefunden hab. Es macht mir aber irgendwie auch wieder Angst, dass es sich um so viele Zeilen handelt und das evtl dann mit diesen mind. 3 Durchgaengen sehr lange dauert (k.A. wieviele Durchgaenge das Sortieren noch braucht.) Ist das also sinnvoll oder gibt es Moeglichkeiten so etwas doch irgendwie in einem Durchgang zu machen?3. Nach welchem Design wuerde man sinnvollerweise ein Programm objektorientiert aufbauen, das obige Funktionalitaet haben soll - welche Design Patterns sind fuer so etwas sinnvoll?
Danke schon mal...
-
Ich finde deine Vorgehensweise gut und wenn du keine Krücke hast geht das fix, ich hatte schon wesentlich größere Dateien.
Da du viel löschen willst und dies nicht nur am Anfang / Ende nimm eine std::list mit strings, dass tolle ist die kannst du leich mit Liste.sort() sortieren
-
ich würds auf die schnelle so in der art machen
typedef struct{.....;....;}record; std::ifstream ifs(filename); std::string line; while(std::getline(ifs,line){ //hier aus line mit stringstream oder wie auch immer die einzelnen recordbestandteile rausparsen und den record in die liste oder vector pushen( vector geht auch problemlos (dürften von der performance keinen grossen unterschied machen und kannst ja ggf auch speicher vorreservieren...) } //zum sortieren kannst du dann z.b. std::sort verwenden... //filtern, maximum finden usw gibts auch fertige stl funktionen so du das nach dem sortieren überhaupt noch brauchst....
-
Hey Danke, danke !!!!
Ich wollte nur noch mal fragen, ob es denn nicht ne Grenze gibt bei Vector/Listen etc. Ich dachte dass es bei sooo vielen Elementen eigentlich problematisch werden koennte, aber wie es scheint sollte es funktionieren. Also wo liegt (speichermaessig/textmaessig) die Grenze bei der Anzahl der Knoten einer Liste?!?
-
Theoretisch gibt es eine Grenze, zumindest bei vektoren, nämlich im index
. Da wird std::size_t benutzt, das ist meistens irgend eine unsigned int mit 64 bit.
-
Oder irgendwann hast du keinen Arbeitsspeicher mehr, dann wird der virtuelle Speicher genommen (dein programm wird schön langsam). Ist auch dieser voll belegt wird dein Programm abstürzen wenn du nicht z.b. den new operator überlädst
-
aber 60.000 Zeilen sollten gar nichts sein. Also mach dir deswegen keine Sorgen!