Anzahl Zeilen in Datei ermitteln
-
Hallo,
ich hab eine Datei, in der ich in jeder Zeile einen Datensatz habe.
Nun möchte ich die Daten in ein Array einlesen. Dazu möchte ich mit
"dimension" ein Array zur Laufzeit erstellen und ihm die größe
Der Zeilenanzahl geben. Wie bestimme ich die Anzahl der Zeilen in einer Datei?Gruß Giovanni
-
Hallo,
schau mal unter TStringList und ->LoadFromFile() nach, vielleicht erübrigt sich deine Frage damit.
Gruß
Mikel
-
Danke, aber leider funktioniert dies so nicht.
Denn ein Datensatz besteht aus 4 Spalten
die erste Spalte von 1-5
... 5-85
... 86-165
...
Ich muss jede eingelesene Zeile vorher aufspalten und erst danach kann ich es in ein "Mehrdimensionales" Array speichern. Dazu benötige ich die Anzahl der Datensätze bzw. die Anzahl der Zeilen in der Datei.Bei jedem Durchlauf der Schleife (also bei jeder eingelesenen Zeile) das Array um 1 zu erhöhen ist keine gute Idee oder? Denn so könnte es sein, dass ich das Array 10000x neu erhöhen muss.
-
Wie viele Minuten hast du dich mit der Hilfe beschäftigt? 3?
Offensichtlich hast du dir wenn überhaupt nur TStringList::LoadFromFile angeguckt. Dass damit nicht alles getan werden kann ist ja klar. Du musst dich schon selbstständig mal n bischen weiter umsehen... Laden kannst du mit der TStringList schon, nun musst du nur noch wissen wie du die Zeilen rausbekommst... Dazu guckst du halt in der Hilfe nach TStringList, guckst dir die Methoden und Eigenschaften an und überlegst dann mal...
Der Rest sollte dann offensichtlich sein.
-
Warum soll das nicht funktionieren ?
Datei mit LoadFromFile("dateiname") in eine TStringListe einlesen.
Danach kanns du bequem jede Zeile Ansprechen und in deine Spalten aufteilen.
Was du mit denen dann weiter anstellst ....
Also wenn überhaupt könnte das Problem in der Performance liegen wenn die Datei riesig ist.Gruß
Mikel
-
Ja, aber nachdem du die Datei mit TStringList::LoadFromFile(const AnsiString FileName) eingelesen hast, hast du quasi eine Liste, wo die Zeilen untereinander stehen. Es gibt bei TStringList auch eine Eigenschaft namens Count, was dir die Anzahl der Zeilen zurückliefert. Da spielen die Spalten keine Rolle.
-
Du kannst es auch so machen:
FILE *datei; char test[540]; // Zeile int rows=0; // Zeilenanzahl datei=fopen(".\\dateiname","r"); // r = "read" (only) reicht ja zum zählen while(fgets(test,sizeof(test),datei)) { // (char) test (540 Zeichen) ist jeweils die ausgelsene Zeile rows++; // Zähl jedes Mal wenn eine neue Zeile beginnt hoch } fclose(datei); ShowMessage("Die Datei hat "+IntToStr(rows)+" Zeilen");
Ich hoffe ich konnte helfen.
MFG Frey
-
Hallo
Frey_1:
danke für die lösung, aber 1. hab ich das schon und 2. bringt mir das nichts für mein array. trotzdem dankeWindoof:
ja, das mit der liste könnte ich so mache, ich glaube das ist ne gute lösung. ich schau mal.Das Array jedes mal neu erhöhen, beim einlesen, ist nicht gut, oder?
Gruß Giovanni
-
Also beim Einlesen der Datei leert er die Stringliste und liest dann erst die neuen Zeilen der Datei ein. Wenn sie größer ist als sie vorher war, ist das so ziemlich egal, oder wie meinst du das?
-
Das hat ich alles vollkommen verstanden. Danke
Ich meine nur, mit meiner jetzigen lösung. ich könnte das array welches ich habe, bei neu dimensionieren, sobald eine zeile hinzukommt.Ich habe also eine schleife in der zeile für zeile die Datei eingelesen wird und in ein array geschrieben wird. und bei jeder zeile füge ich dem array eine variable hinzu.
lese zeile ein;
vergrößere array von 998 auf array[999];
schreibe in array[999];lese zeile ein;
vergrößere array von 999 auf array[1000];
schreibe in array[1000];
...und das ganze halt in einer Schleife. Ist keine gute Lösung, oder?
Gruß Giovanni
-
Naja, einmal reicht, nimm dazu aber nen vector.
#include<vector.h> //... vector<AnsiString>asArray(1); //... asArray.resize(slListe->Count); //Einmal auf die entsprechende Groesse aendern, das reicht aus. for (int i=0;i<slListe->Count;i++) { asArray[i]=slListe->Strings[i]; }
So z.B.
-
okay danke hast mir soweit gut geholfen. jetzt überleg ich mir das ganze mal wie ichs mache!
Gruß Giovanni