CSV Datei auslesen und in Array speichern

MaRlik

Mitglied
Hallöchen,

ich bin gerade verzweifelt daran, eine CSV Datei zu lesen und den Inhalt in einem Array zu speichern. Die Inhalte in der CSV sind Text und Zahlen. Die Datei sieht so aus:

Code:
10.0.0;Lambsheim Raiffeisenstrasse;LA1;LA1_DB_10_1025;Raiffeisenstrasse Netzschutz ausgelöst;1;
10.0.1;Lambsheim Raiffeisenstrasse;LA1;LA1_DB_10_1026;Raiffeisenstrasse Batterie Störung;1;
10.0.2;Lambsheim Raiffeisenstrasse;LA1;LA1_DB_10_1027;Raiffeisenstrasse Ladegerät Störung;0;

Nun probiere ich mit diesem c++ code alles einzulesen und in einem Array abzulegen:

C++:
#include <fstream.h>
#include <stdio.h>
#include <iostream.h>
#include <sstream.h>

using namespace std;

main()
{
  // öffnen Datei
  fstream datei1("C:\\Programme\\Borland\\CBuilder6\\Projects\\csv_einlesen\\DIG_ALFA.CSV", ios::in);

  if ( datei1.good() )
  {
    // Konvertierungsstreams
    istringstream is,temp;
    string inhaltzeile;

    // Ermitteln der Anzahl der Eintraege //
    // Vorlesen
    getline(datei1,inhaltzeile);

    // Zähler auf 0 wegen Vorlesen
    int anzahl_eintraege = 0;

    while ( !datei1.eof() )
    {
      // Anzahl +1
      anzahl_eintraege++;
      // Nachlesen
      getline(datei1,inhaltzeile);
    }

    printf ("%d Elemente!\n\n",anzahl_eintraege);

    // Strukt erzeugen
    typedef struct {
      int DB;
      int Byte;
      int Bit;
      string Name;
      string Name_kurz;
      string Name2;
      string Meldetext;
      bool no_nc;
    } DIG_ALFA_typ;

    // Anlegen Array für Datei
    DIG_ALFA_typ * feld;
    feld = (DIG_ALFA_typ*) malloc(anzahl_eintraege * sizeof (DIG_ALFA_typ) );

    // Eigentliches auslesen und umladen in array !
    // Zurück an Anfang!
    datei1.clear(0);
    datei1.seekg(0L,ios::beg);

    // Vorlesen
    getline(datei1,inhaltzeile);
    int element = 0;

    while ( !datei1.eof() )
    {
      // Zeile ingelesen in is
      is.str(inhaltzeile);

      // Temp vars ...
      string DB_str;
      string Byte_str;
      string Bit_str;
      string no_nc_str;
      string blubb;
      int intzahl;

      // Einzelnen Elemente auslesen
      getline(is,DB_str,'.');
      temp.str( DB_str );
      temp >> intzahl;

//      temp >> feld[element].DB;
      getline(is,Byte_str,'.');
      temp.str( Byte_str );
      temp >> feld[element].Byte;
      getline(is,Bit_str,';');
      temp.str( Bit_str );
      temp >> feld[element].Bit;
      getline(is,blubb,';');
      getline(is,blubb,';');
      getline(is,blubb,';');
      getline(is,blubb,';');


      printf("%c%c%c",blubb[0],blubb[1],blubb[2]);

//      getline(is,feld[element].Name,';');
//      getline(is,feld[element].Name_kurz,';');
//      getline(is,feld[element].Name2,';');
//      getline(is,feld[element].Meldetext,';');

//      printf("%s",blubb);

      getline(is,no_nc_str,';');
      temp.str( no_nc_str );
      temp >> feld[element].no_nc;

      cout << "DB: " <<  DB_str << " " << intzahl << " Byte: " << Byte_str << " Bit: " << Bit_str << " NO_NC: " << no_nc_str << endl;

      // Zeiger erhöhen
      element++;

      // Nachlesen
      getline(datei1,inhaltzeile);
    }

    // Schließen Datei
    datei1.close();

    // Speicher freigeben
    free(feld);

  }
  else
  {
    printf("Fehler: Datei nicht vorhanden\n");
  }

  getchar();
}

Der Teil in dem ich die Anzahl der Felder auslese, speicher für das array reserviere usw. sollte eigentlich soweit passen. Klappt auch.

Beim Auslesen der einzelnen Inhalte zu ich mir leider recht schwer. Immer die Konvertierungen usw. die in meinen Augen "hingebogen" sind, aber anders klappts nicht. Die Konvertierung in Zeile 77 funktioniert genau beim ersten eintrag, danach z.B. nicht mehr.

Ein größeres Problem ist aktuell der Versuch den Namen usw aus der TXT auszulesen und in das Array zu packen. Klappt nie, da es immer Probleme mit der Konvertierung gibt.

Was könnt ihr mir raten? Wo hab ich große Fehler drin? Wie kann man es eleganter machen?

Ich bin um jede Hilfe und auch im Kritik dankbar!
 
Hi.

Ich hab dein Programm mal etwas verbessert, die gröbsten Fehler beseitigt und den Code mehr im C++ Stil gestaltet.

Zu deinen Fehlern:

  • C++ Headerdateien haben keine Endung. D.h. es muss iostream und nicht iostream.h heißen. Headerdateien der C Bibliothek werden in C++ mit dem Präfix c und auch ohne Endung eingebunden - also cstdio und nicht stdio.h usw.
  • du liest irgendetwas ein und prüfst nicht ob das Einlesen überhaupt erfolgreich war
  • du verwendest die .eof() Methode in einer Schleife. Das ist falsch. Die .eof() .good(), fail() und bad() Methoden benötigt man fast nie, nur wenn man sich damit auskennt.
C++:
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <iterator>
 
using namespace std;

// Strukt erzeugen
typedef struct {
	int DB;
	int Byte;
	int Bit;
	string Name;
	string Name_kurz;
	string Name2;
	string Meldetext;
	bool no_nc;
} DIG_ALFA_typ;

ostream& operator<< (ostream& out, const DIG_ALFA_typ& d) {
	return 
		out << d.DB << '.' << d.Byte << d.Bit << ';'
			<< d.Name << ';' << d.Name_kurz << ';'
			<< d.Name2 << ';' << d.Meldetext << ';'
			<< d.no_nc << ';';
}

 
int main() {
	// öffnen Datei
	ifstream datei1("data.csv");
 
	if ( datei1.is_open() )
	{
		string inhaltzeile;
		vector<DIG_ALFA_typ> content;

		while (getline(datei1,inhaltzeile)) {
			DIG_ALFA_typ entry;
			
			istringstream is(inhaltzeile);
			
			if (is >> entry.DB   && is.get() == '.' &&
				is >> entry.Byte && is.get() == '.' &&
				is >> entry.Bit  && is.get() == ';' &&
				getline(is, entry.Name, ';') &&
				getline(is, entry.Name_kurz, ';') &&
				getline(is, entry.Name2, ';') &&
				getline(is, entry.Meldetext, ';') &&
				is >> entry.no_nc && is.get() == ';') 
			{
				content.push_back(entry);
			} else {
				cerr << "could not parse input line: " << inhaltzeile << endl;
			}
		}
		cout << content.size() << " Elemente!\n\n";

		copy(content.begin(), content.end(),
			 ostream_iterator<DIG_ALFA_typ>(cout, "\n"));
	} else {
		cerr << "could not open file." << endl;
	}
        cin.get();
}
Gruß
 
Viele Dank! Hab mich mal in die Befehle usw eingelesen, nun ist mir auch da fast alles verständlich.

Ich denke der Rest kommt mit der Zeit! Vielen Dank nochmal!
 

Neue Beiträge

Zurück