Wie kann ich eine CSV-Datei in ein ListView laden?



  • Ich würde gerne eine CSV-Datei, deren Daten mit ";" unterteilt ist,
    Zeile für Zeile in einem ListView laden. Wie kann ich dieses mit Win32 API umsetzen?

    Theoretisch hätte ich folgende Ideen; habe jedoch Probleme bei der Umsetzung.

    Jedes Byte der CSV einzeln lesen und prüfen, ob z.B ";" oder EOL vorhanden ist
    und sich somit die Strings byte für byte selber zusammenbasteln. Dieses dürfte
    aber wohl bei großen Datenmengen (bzw großen Dateien) recht langsam sein.

    Die komplette CSV in einen gleichgroßen Buffer lesen und diesen dann im loop
    auf ";" und EOL überprüfen und die Strings direkt ins ListView schreiben.
    Theoretisch verstehe ich, wie dieses funktionieren würde. Nur die Umsetzung
    in einen funktionierenden Win32 Code bereitet mir noch Probleme.

    bool MyReadFile(HANDLE hFile)
    {
    	ULONG bytesToRead;
    
    	if ((length = GetFileSize(hFile,0)) == 0)
    		return false;
    
    	// allocate new filebuffer
    	if((buffer = new char[length]) == 0)
    		return false;
    
    	// read entire file into memory
    	ReadFile(hFile, buffer, length, &bytesToRead, 0);
    
    	CloseHandle(hFile)
    	return true;
    }
    

    Für eine andere Sache benötige ich auch die Funktion, eine Textdatei (keine CSV), Zeile für Zeile einzulesen.



  • Hat niemand eine Idee, wie ich dieses mit Win32 API umsetzen kann?



  • Warum liest Du denn einen ganzen Block aus, wenn Du es Zeile für Zeile einlesen willst?

    Ich würde die Datei Zeile für Zeile mit ifstream oder fscanf einlesen und den String dann per boost::split() in einem Vector speichern.



  • Da ich im Vorfeld nicht weiss, wieviele Einträge in der CSV-Datei vorhanden sind, war meine Überlegung, die Dateigröße zu ermitteln, dann entsprechend einen temorärten Buffer zu erstellen, wo die ganze Datei recht schnell in diesen Buffer gelesen wird.

    Wenn dieses vollzogen ist, war meine Überlegung, die Buffer per Loop durchlaufen zu lassen und jedes einzelne Zeichen z.b. auf ";" oder Zeilenschaltung zu überprüfen und entsprechend die einzelnen Zeilen und deren durch ";" unterteilten Elemente zu ermitteln, so dass ich diese dann schnell und einfach in ein ListView mit meheren Spalten korrekt anzeigen lassen kann.



  • Nimm doch einfach einen fertigen Parser, z.B. https://github.com/jay/CSV (ist auch ein VS-Projekt dabei).



  • Du hast doch schon die Lösung, nur was ist das Problem?

    So lange wird das Auslesen und Zerteilen der Strings nun auch wieder nicht dauern, außer Du hast wirklich große Dateien vor Dir liegen.



  • Ich habe einige Jahre in Basic-Sprachen programmiert und bekomme die Routine dort auch hin. Mein Problem ist nur, dass ich inzwischen zu C/C++ und Win32 wechsel und hier weiss ich leider noch nicht wirklich, wie ich das ganze in C/C++ Code (ggfl. auch mit Pointern) umsetzen kann. Hierfür fehlt mir leider in diesem Bereich noch die nötige Erfahrung, wie man das in C/C++ macht. Die Theorie und diese auch in Basic umzusetzen sind absolut kein Problem. Es hapert bei mir einfach noch an den zu lernenden C/C++ Programmierstyle/Schreibweise.



  • Hier Code zu liefern wird auch schlecht funktionieren, da Du diesen Teil dann ja nicht verstehst. Ich kann dir jedoch mal einen Pseudocode geben.

    Datei laden mittels std::ifstrem
    std::getline() Schleife bis zum Ende der Datei durchgehen lassen.
    Eingelesene Zeile mittels boost::split() zerteilen und in einem Vector speichern.
    Eine Schleife mit der Anzahl der Items im Vector durchgehenlassen und mittels Listview_InsertItem zum ListView hinzufügen.

    Oder Du nimmst einen Parser wie Th69 schon geschrieben hat. Musst Du dann selbst entscheiden.
    Btw. das MSDN ist Dein Freund...


Anmelden zum Antworten