2011-01-12 10 views
0

Mögliche Duplizieren:
CSV parser in C++Lese CSV-Datei in C++

Hallo, ich in c eine CSV-Datei in ein 2D-Array lesen möchten ++. Stellen Sie sich vor meine csv-Datei ist: a, b, c d, e, f Wird jemand mir helfen, dies zu einem 2x3 Tisch zu machen? Danke,

+3

Haben Sie diese SO gesehen [Frage] (http://StackOverflow.com/Questions/1120140/csv-Parser- in-c)? – Nekresh

+0

warum nicht versuchen, dies selbst zu tun? Wenn Ihr Code nicht funktioniert und Sie nicht verstehen können, warum nicht, dann veröffentlichen Sie Ihren Code und zeigen Sie, wie sich die Ergebnisse von Ihren Erwartungen unterscheiden. Wenn Sie dies tun, werden Ihnen die Menschen helfen. – ravenspoint

+0

Duplizieren Sie die folgende Frage: http://stackoverflow.com/questions/1120140/csv-parser-in-c –

Antwort

1

Oh in Ordnung hier ist etwas, das es tun wird. Es ist darauf spezialisiert, Ihre Bedürfnisse zu erfüllen, aber es funktioniert. Ich habe auch eine BOOST-Technik, aber das ist wahrscheinlich zu weit fortgeschritten für Sie ...

#ifndef BOOST_METHOD 
std::string popToken(std::string& text, const std::string& delimiter) 
{ 
    std::string result = ""; 
    std::string::size_type pos = text.find(delimiter); 
    if (pos != std::string::npos) { 
     result.assign(text.begin(), text.begin() + pos); 
     text.erase(text.begin(), text.begin() + pos + delimiter.length());   
    } else { 
     text.swap(result); 
    } 
    return result; 
} 
#endif 

void readCSV() 
{ 
    const size_t rows = 2; 
    const size_t cols = 3; 
    std::string data[rows][cols]; 
    std::ifstream fin; 

    fin.open("csv.txt"); 
    if (! fin.fail()) { 
     std::string line; 
     while (! fin.eof()) { 
      fin >> line; 
#ifdef BOOST_METHOD 
      boost::tokenizer<boost::escaped_list_separator<char> > tknzr(line, boost::escaped_list_separator<char>('\\', ',', '\"')); 
      boost::tokenizer<boost::escaped_list_separator<char> >::iterator it = tknzr.begin(); 
      for (size_t row = 0; row < rows && it != tknzr.end(); row++) { 
       for (size_t col = 0; col < cols && it != tknzr.end(); col++, ++it) { 
        data[row][col] = *it; 
        std::cout << "(" << row << "," << col << ")" << data[row][col] << std::endl; 
       } 
      } 
#else 
      for (size_t row = 0; row < rows && line.length(); row++) { 
       for (size_t col = 0; col < cols && line.length(); col++) { 
        data[row][col] = popToken(line, ","); 
        std::cout << "(" << row << "," << col << ")" << data[row][col] << std::endl; 
       } 
      } 
#endif 
     } 
     fin.close(); 
    } 
} 
+0

Sie können die Include-Anweisungen selbst herausfinden –

+1

#ifdef direkt in den Code einfügen. Beeindruckend. Nicht nett. Macht es wirklich schwer zu lesen. –

+0

Yup. Für dieses Beispiel, was auch immer ... Es ist ein Wunder, dass ich sogar antwortete. –