CSV in StringGrid



  • Hallo Leute,

    ich würde gerne eine CSV-Datei in einen StringGrid einlesen.
    Ich habe die Snippets aus der FAQ versucht, bekomme da aber nix zum funktionieren.

    Danke Mark



  • "Funktioniert nicht" ist keine ausreichende Problembeschreibung.



  • ok, sagen wir es anders. Ich kann eine CSV-Datei in eine Stringlist lesen, kapiere dann aber nicht wie ich die Werte in die Zellen der StringGrid bekomme.



  • Was hast du konkret versucht, wie sieht die Datei aus und was ist das Ergebnis?
    Wie soll dir jemand helfen, wenn du keine Informationen gibst!?



  • String Daten[5][5];
    
      TStringList *list = new TStringList();
      list->LoadFromFile("c:\\test.csv");
      TStringList *line = new TStringList();
      line->Delimiter = ';';
      for (int y = 0; y < list->Count; y++)     // Zeilen abklappern
      {
        line->DelimitedText = list->Strings[y]; // aktuelle Zeile einlesen
        for (int x = 0; x < line->Count; x++)
          Daten[x][y] = line->Strings[x];          // Zeile aufsplitten
          StringGrid1->Cells[x][y]=list->Strings[y];
      }
      delete line;
      delete list;
    

    Das war mein letzter Stand, da war von Dir, nur meine Modifikation bringt:
    [C++ Fehler] Unit1.cpp(31): E2451 Undefiniertes Symbol 'x'
    Verstehe ich nicht, x ist doch definiert.



  • so sollte es gehen, Du hast die List ja nicht zerlegt um damit weiterzuarbeiten,
    also nicht list->Strings[y] sondern line->Strings[x];

    String Daten[5][5];
    
      TStringList *list = new TStringList();
      list->LoadFromFile("c:\\test.csv");
      TStringList *line = new TStringList();
      line->Delimiter = ',';
      for (int y = 0; y < list->Count; y++)     // Zeilen abklappern
      {
        line->DelimitedText = list->Strings[y]; // aktuelle Zeile einlesen
        for (int x = 0; x < line->Count; x++)
          {
          Daten[x][y] = line->Strings[x];          // Zeile aufsplitten
          StringGrid1->Cells[x][y]=line->Strings[x];
          }
      }
      delete line;
      delete list;
    


  • Hallo,

    Mir ist hier noch nicht ganz klar woher du weißt, wieviele Zeilen es gibt.
    Ich biete hier mal folgendes an.

    #include <string>
    #include <vector>
    #include <fstream>
    
    std::ifstream in("test.txt");
    std::string tstr;
    std::vector<std::string> str_vect;
    while( std::getline(in, tstr))
    {
      if( in.good())
      {
        str_vect.push_back(tstr);	
      }
    }
    TStringList *line = new TStringList;
    line->Delimiter = ';';
    StringGrid1->RowCount = str_vect.size();
    for( int i=0; i<StringGrid1->RowCount; ++i)
    {
       line->DelimitedText = std_vect[i].c_str();
       if( line->Count > StringGrid->ColCount) StringGrid->ColCount = line->Count;
       StringGrid->Rows[i]->Text = line->Text;
    }
    delete line;
    

    [edit]Header und namespace eingefügt[edit]



  • Hallo, das von myerscola geht nachdem ich ',' durch ';' ersetzt habe, das von braunstein bringt diese Meldungen:
    [C Fehler] Unit1.cpp(66): E2451 Undefiniertes Symbol \\'string\\'
    [C Fehler] Unit1.cpp(66): E2379 In Anweisung fehlt ;
    [C Fehler] Unit1.cpp(67): E2451 Undefiniertes Symbol \\'vector\\'
    [C Fehler] Unit1.cpp(67): E2451 Undefiniertes Symbol \\'str_vect\\'
    [C Fehler] Unit1.cpp(68): E2451 Undefiniertes Symbol \\'tstr\\'
    [C Fehler] Unit1.cpp(68): E2285 Keine Übereinstimmungür'getline<_CharT,_Traits,_Alloc>(ifstream,undefined)'gefunden [C Fehler] Unit1.cpp(68): E2268 Aufruf der undefinierten Funktion \\'getline\\'
    [C Fehler] Unit1.cpp(80): E2451 Undefiniertes Symbol \\'std_vect\\'
    Ich habe bisher nur mit 5 Rows und 5 Cols gearbeitet und deshalb war das bisher bekannt.



  • Hallo

    Dir fehlen Grundlagen von C++.
    string (kleingeschieben) ist Teil des C++ Standards und Teil des namespaces std, genaus wie ifstream.
    Das muß also heißen

    std::string tstr;
    

    Oder oben in der Implementationsdatei (nie im Header)

    using namespace std;
    

    bis bald
    akari



  • Quelltext wurde angepasst. 🙂



  • ich habe es jetzt mal so angepasst:

    std::ifstream in("test.txt");
    std::string tstr;
    vector<string> str_vect;
    while( getline(in, tstr))
    { 
      if( in.good()) 
      { 
        str_vect.push_back(tstr);
      }
    } 
    TStringList *line = new TStringList;
    line->Delimiter = ',';
    StringGrid1->RowCount = str_vect.size(); 
    for( int i=0; i<StringGrid1->RowCount; ++i) 
    { 
       line->DelimitedText = str_vect[i].c_str();
       if( line->Count > StringGrid1->ColCount) StringGrid1->ColCount = line->Count;
       StringGrid1->Rows[i]->Text = line->Text;
    } 
    delete line;
    

    bringt mit dann aber einen AccessViolation:
    const _CharT* c_str() const { return this->_M_start; }

    DAnke und Gruß Mark



  • Der Code sollte so eigentlich funktionieren. Welchen Builder hast du denn?



  • war leider den ganzen Tag mit Arbeit unterwegs. ich habe CBuilder 6 prof.


Anmelden zum Antworten