csv-Datei durchsuchen
lima-city → Forum → Programmiersprachen → C/C++ und D
array
bad
bemerkung
code
datei
erreicht string
falsch mache
fehl
fehler
feld
lese
parameter
spalten
speichern
start
string
test
tip
vorliegen
zeile
-
Hallo
Ich versuche gerade ein .csv Datei mit meinem c++ Programm aus zu lesen und diese dann später zeilenweise in einem Array zu speichern. Also ein Zeile besteht aus 4 spalten und soll dem nach ein Array von 0-3 füllen.
So aber jetzt mein Problem ich bekomme es gar nicht richtig hin die Datei einzulesen.
Hier ist mein Code den ich im Netz gefunden hab nach dem ich den halben Nachmittag gegoogelt hab, hat jemand einen Tipp was ich falsch mache?
hier der Code:
fstream datei1("testdatei.csv", ios::in); string s; datei1.open("testdatei.csv", ios::in); // Öffne Datei aus Parameter while (!datei1.eof()) // Solange noch Daten vorliegen { getline(datei1, s); // Lese eine Zeile cout << s << endl; // Zeige sie auf dem Bildschirm } datei1.close();
Wäre super wenn mir jemand helfen könnte, damit ich mir endlich überlegen kann wie ich das mit dem Durchsuchen und Array anstellen kann. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo tft-development,
das sollte eigentlich funktionieren:
#include <iostream> #include <fstream> #include <string> using namespace std; int main(int argc, char ** argv) { fstream csv("test.csv", fstream::in); // Öffne die Datei zum Lesen while(!csv.eof()) // Solange Dateiende nicht erreicht { string s; getline(csv, s); // Lese Zeile cout << s << endl; } csv.close(); // Schließe Datei. return 0; }
Das läuft bei mir zumindest einwandfrei. Mit Zerlegung der Zeile sieht es dann z.B. so aus:
#include <iostream> #include <fstream> #include <string> #include <vector> using namespace std; vector<string> * split_line(const string& line, const string& separator) { size_t start, end; // Start und Ende eines gefundenen Substrings size_t sep_length = separator.length(); // Länge des Separators vector<string> * v = new vector<string>(); // vector zum Speichern der Felder start = 0; while((end = line.find(separator, start)) != string::npos) { v->push_back(line.substr(start, end-start)); start = end + sep_length; } end = line.length(); v->push_back(line.substr(start, end-start)); return v; } int main(int argc, char ** argv) { fstream csv("test.csv", fstream::in); // Öffne die Datei zum Lesen while(!csv.eof()) // Solange Dateiende nicht erreicht { string s; getline(csv, s); // Lese Zeile vector<string> * fields = split_line(s, "\t"); // Zerlege Zeile for(size_t i = 0; i<fields->size(); i++) cout << (*fields)[i] << "#"; // gebe Felder aus cout << endl; delete fields; // Zerstöre vector } csv.close(); // Schließe Datei. return 0; }
Beitrag zuletzt geändert: 29.8.2013 15:57:59 von darkpandemic -
wow danke funktioniert wie geschmiert :D
grüße -
Vielleicht machst du dir damit auch das Leben einfacher:
http://stackoverflow.com/questions/7827274/whats-the-preferred-library-for-csv-parsing-writing-in-c
Beitrag zuletzt geändert: 30.8.2013 8:48:21 von tchab -
Anscheinend haben hier einige immer noch Probleme mit dem korrekten Error-Handling bei Dateizugriffen:
#include <fstream> #include <iostream> #include <string> int main() { std::string line; std::fstream fs("schnappi.txt",std::ios::in); if(fs.bad()) { std::cerr << "Ein Fehler ist aufgetreten." << std::endl; return 1; } while(getline(fs,line)) { std::cout << "Z: " << line << std::endl; } fs.close(); return 0; }
Bemerkung: evt. existiert die Datei nicht, so wird kein Fehler ausgegeben, das Öffnen schlägt fehl und somit ist eof() nicht definiert. Da ist es doch schöner,. zu prüfen ob die Datei korrekt geöffnet wurde und ob getline() denn fehlschlägt.
Ansonsten sollte man z.B. darauf achten, dass jede Zeile gleich viele Spalten haben und die Spalten z.B. nur die erwünschten Zeichen beinhalten. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage