ERLEDIGT
JA
JA
ANTWORTEN
3
3
ZUGRIFFE
2436
2436
EMPFEHLEN
-
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 :1 2 3
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:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
#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!
-
17.04.09 13:23 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
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.
GrußCode cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
#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(); }
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
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!
-
Da das hier verlinkt wurde von http://www.tutorials.de/forum/c-c/33...tei-fread.html ...
Unter C++ ist das typedef vor der struct wohl eher unüblich. Dann bietet sich an hier auch operator>> zu überladen anstatt das direkt inner main zu machen. Dann kann das einlesen zu nem ein-(max. zwei-)zeiler werden. (std::copy o. c-tor + istream_iterator).
Ähnliche Themen
-
VB Textfile auslesen, in 2d Array speichern
Von rollerueckwaerts im Forum .NET Windows FormsAntworten: 2Letzter Beitrag: 04.12.09, 08:24 -
Array in Datei speichern
Von JimboJT im Forum C/C++Antworten: 11Letzter Beitrag: 07.05.08, 14:27 -
XML Post mit PHP auslesen und in ein Array speichern
Von MiMi im Forum PHPAntworten: 4Letzter Beitrag: 12.12.07, 12:14 -
Datei unter VB öffnen, auslesen und im Array speichern
Von FunthomasX im Forum Visual Basic 6.0Antworten: 11Letzter Beitrag: 07.04.05, 09:48 -
Array in Datei Speichern
Von BFreakout im Forum PHPAntworten: 3Letzter Beitrag: 02.04.04, 23:09





Zitieren
Login






