2012-09-02 28 views
6

Es tut mir leid, wenn das gefragt wurde, aber ich kann keine Lösung finden, die mir hilft. Ich versuche, Daten aus einer Textdatei einzulesen und sie schließlich in einem Objekt zu speichern.Lesen von CSV-Daten aus einer Datei

Die Textdatei enthält 4 Variablen, die alle durch Kommata getrennt sind.

habe ich versucht, dies zu tun, wie folgt:

string v1, v2, v3, v4; 
ifstream afile; 
afile.open("thefile.txt"); 
afile >> v1 >> v2 >> v3 >> v4; 
afile.close(); 
cout << v1 << endl; 
cout << v2 << endl; 
cout << v3 << endl; 
cout << v4 << endl; 

Die Datei mehrere Datensätze hat. Ich habe versucht, nur 1 vorläufig zu machen, um sicherzustellen, dass es funktioniert, aber wenn es die Daten einliest, trennt es sich nicht an den Kommas.

Von dort möchte ich die Daten in einem Objekt speichern. Wird die folgende Arbeit: Thing * thing1 = neue Thing (v1, v2, v3, v4);

Obwohl, wenn ich in sagen, 5 Datensätze, was wäre der beste Weg, um die obige Codezeile zu strukturieren? Da jedes Objekt einen eindeutigen Namen benötigt, gibt es eine Möglichkeit, wie ich vielleicht mit einer for-Schleife und einem Vektor iterieren könnte? dh for (int i = 0; i < 5; i ++) {// in Daten lesen // Speicher in Vektor }

Irgendwelche Hinweise sind sehr

+0

mögliche Duplikate von [Wie schreibe ich in/aus Textdatei mit durch Komma getrennten Werten] (http://stackoverflow.com/questions/1474790/how-to-read-write-into-from-text-file -mit-komma-separierten Werten) –

Antwort

8

Das CSV-Format geschätzt ist komplizierter als nur ein Komma-Trennzeichen. Es kann Anführungszeichen enthalten, die Sie entsprechend entziffern und interpretieren sollten, und verschiedene Trennzeichen können zulässig sein. Sie sollten wirklich eine dedizierte CSV-Import/Export-Bibliothek verwenden, wenn Ihre Eingabedatei nicht streng formatiert ist.

Eine Tokenizer-Klasse kann Ihre Frage beantworten (z. B. die von boost oder simpler ones sind verfügbar).

Sie sollten die otherquestions zu diesem Thema überprüfen.

6

Heed @ Soravux beantworten und verwenden Sie eine spezielle Bibliothek, wenn Sie können. Insbesondere scheint das von ihm vorgeschlagene strtk-Toolkit interessant zu sein und ist nur ein einziger Header. Boost kann es auch auf mindestens 5 verschiedene Arten tun und ist eine Bibliothek, die es wert ist, gelernt zu werden, wenn Sie C++ für einige Zeit benutzen werden. Nichtsdestoweniger werden all diese Lösungen Ihr Programm etwas komplexer machen, und die Chancen stehen gut, dass Sie diese Bemühungen woanders ausgeben wollen, besonders wenn Sie nur einen sehr einfachen Nummernleser benötigen. Hier ist, wie in Standard C++ gehen (mit STL, zum Beispiel Vektor und Streams):

#include <iostream> 
    #include <sstream> 
    #include <fstream> 
    #include <string> 
    #include <algorithm> 
    #include <vector> 

    using namespace std; 

    vector<double> &split(const string &s, 
     char delim, vector<double> &elems) 
    { 
     stringstream ss(s); 
     string item; 
     while (std::getline(ss, item, delim)) { 
      stringstream conv(item); 
      double number; 
      conv >> number; 
      elems.push_back(number); 
     } 
     return elems; 
    } 

    struct my_record_t{ 
     double f1, f2, f3, f4; 
    }; 

    typedef vector<my_record_t> my_record_vector_t; 

    int main(int argc, char* argv[]) 
    { 
     stringstream in("10,20,2.0,5\n" 
          "4.,5.,6.,80\n" 
          "4.,2.,6.,70\n" 
          "4.,5.,6.,86\n" 
          "2.,5.,9.,80\n"); 
     // Or alternatively, : 
     // ifstream in("myfile.csv"); 

     // Here you store your records 
     my_record_vector_t mrv; 

     string line; 
     vector<double> numbers; 
     while(std::getline(in, line, '\n')) 
     { 
      numbers.clear(); 
      split(line, ',', numbers); 
      my_record_t r; 
      r.f1 = numbers[0]; 
      r.f2 = numbers[1]; 
      r.f3 = numbers[2]; 
      r.f4 = numbers[3]; 
      mrv.push_back(r); 
     } 

     cout << mrv.size() << " records read" << endl; 


     return 0; 
    } 

Ein bisschen zu lang vielleicht, aber es kann den Tag retten.

4

Ich würde Using ifstream to read floats betrachten und mit der Analyse von Kommas beginnen. Das CSV-Format ist komplizierter, aber das Beispiel sollte Ihnen den Einstieg erleichtern. Das Beispiel verwendet die String Toolkit, die sehr gut darin ist, Text zu analysieren und in die Strukturelemente zu konvertieren, die Sie benötigen.