Tabellen vergelichen ?



  • Ich steh gerade voll auf dem Schlauch und hoffe das ihr mir da helfen könnt.

    Zur Verfügung stehen 2 Tabellen, Tabelle 2 ist mit den Werten aus einer CSV Dateien gefüllt.
    In Tabelle 1 wird per Zufall eine Zeile ausgewählt.

    In Tabelle 2 sind die Spalten mit einem Komma getrennt.
    Nun soll das Eregbnis aus Tabelle 1 in Spalte 2 von Tabelle 2 gesucht werden, bei einer Übereinstimmung soll der Inhalt aus Spalte 1 zurück gegeben werden.

    Beispiel.
    Zufällig wird Zeile 2 ausgewähnt --> Müller
    Nun soll in Tabelle 2 (Spalte2), also nach dem 1. Komma Müller gescht werden. Ist dies vorhanden wird alles bis zum 1. Komma zurück gegeben also Carsten.

    Tabelle 1

    Mayer
    Müller
    Schmitt
    Ostendrof
    

    Tabelle 2

    Herbert, Gras, Hamburg
    David, Grün, Berlin
    Sebastian, Mayer, Dortmund
    Tobias, Schmitt, Essen
    Carsten, Müller, München
    

    Bislang komme ich nur auf große 3-fach verschachtelte for-Schleifen mit jeweils mehreren switch/case.

    Geht das nicht einfacher ?



    1. falsches Forum, gehört nach C++ (auch wenn du mit dem Builder programmierst)
    2. lies die CSV-Datei in eine passende Datenstruktur (falls es sich hierbei nicht um Millionen von Zeilen handelt):
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <functional>
    
    struct Person
    {
       std::string Vorname;
       std::string Nachname;
       std::string Wohnort;
    };
    
    // Daten in Vektor einlesen
    std::vector<Person> read_file( const std::string& FileName )
    {
       std::vector<Person> retVal;
    
       // Daten einlesen
       ...
    
       return retVal;
    }
    
    // die Suche kann jetzt mit std::find_if implementiert werden:
    // ab Builder 10 mit einem Lambda, davor mit einem Funktor
    
    // bis Builder 10
    struct PersonEqualsName : std::binary_function<Person,std::string,bool>
    {
       bool operator()( const Person& lhs, const std::string& rhs ) const
       {
          return lhs.Nachname == rhs;
       }
    };
    
    int main()
    {
       std::vector<Person> v = read_file( "...." );
    
       std::string Name = "Müller";
       std::cout << "Suche nach '" << Name << "'\n";
    
       // bis Builder 10
       std::vector<Person>::const_iterator pos = find_if( v.begin(), v.end(), std::bind2nd( PersonEqualsName(), Name ) );
       if( pos != v.end() )
       {
          std::cout << "Der Vorname der Person '" << Name << "' lautet '" << pos->Vorname << "'\n";
       }
       else
       {
          std::cout << "Person '" << Name << "' wurde nicht gefunden.\n";
       }
    
       // ab Builder 10
       auto pos = find_if( v.begin(), v.end(), [&Name]( const Person& p )
                                               {
                                                  return p.Nachname == Name;
                                               } 
                         );
       if( pos != v.end() )
       {
          std::cout << "Der Vorname der Person '" << Name << "' lautet '" << pos->Vorname << "'\n";
       }
       else
       {
          std::cout << "Person '" << Name << "' wurde nicht gefunden.\n";
       }
    }
    

    Falls du dich noch nicht mit den Datentypen und Algorithmen der STL auskennst ist jetzt ein guter Zeitpunkt damit anzufangen 😉
    Und da du im Builder Forum gepostet hast: benutz´ nicht die VCL Datentypen, sondern die C++ STL.