2012-09-02 43 views
6

Lo siento si esto se ha preguntado, pero parece que no puedo encontrar una solución que me ayude. Intento leer datos de un archivo de texto y finalmente almacenarlos en un objeto.Lectura de datos CSV de un archivo

El archivo de texto tiene 4 variables, todas separadas por comas.

He tratado de hacer esto de la siguiente manera:

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; 

El archivo tiene varios registros. Intenté simplemente hacer 1 por ahora para asegurarme de que funciona, pero cuando se lee en los datos, no se separa en las comas.

A partir de ahí, quiero almacenar los datos en un objeto. Funcionará lo siguiente: Cosa * thing1 = new Thing (v1, v2, v3, v4);

Aunque, cuando leo en decir 5 registros, ¿cuál sería la mejor manera de estructurar la línea de código anterior? Como cada objeto necesita un nombre único, ¿hay alguna manera de iterar tal vez usando un bucle for y un vector? es decir for (int i = 0; i < 5; i ++) { // leer datos // tienda en vector }

Alguna pista son muy apreciados

+0

posible duplicado de [Cómo leer-escribir en/desde archivo de texto con valores separados por comas] (http://stackoverflow.com/questions/1474790/how-to-read-write-into-from-text-file -con-comma-separated-values) –

Respuesta

8

El formato CSV es más complicado que solo un separador de coma. Puede contener comillas que debe escapar e interpretar en consecuencia y se pueden permitir diversos separadores. Realmente debería usar una biblioteca dedicada de importación/exportación de CSV si su archivo de entrada no está estrictamente formateado.

Una clase de tokenizador puede responder a su pregunta (como la de boost o simpler ones están disponibles).

Debe consultar el otherquestions sobre este tema.

6

Heed @Soravux responde y usa una biblioteca especializada si puedes. En particular, el kit de herramientas strtk que sugiere parece interesante y es solo un encabezado. Boost también puede hacerlo en al menos 5 formas diferentes, y es una biblioteca que vale la pena aprender si va a usar C++ durante algún tiempo. Dicho esto, todas esas soluciones agregarán algo de complejidad a su programa, y ​​es probable que desee gastar ese esfuerzo en otro lado, especialmente si todo lo que necesita es un lector de números muy simple. Aquí es cómo ir en C++ estándar (con STL, por ejemplo, el vector y corrientes):

#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; 
    } 

un poco demasiado largo, tal vez, pero puede salvar el día.

4

Me gustaría ver Using ifstream to read floats y comenzar con el análisis en coma. El formato CSV es más complicado, pero el ejemplo debería ayudarlo a comenzar. El ejemplo usa el String Toolkit, que es muy bueno para analizar texto y convertirlo en los elementos de estructura que necesita.

Cuestiones relacionadas