Spalte einlesen und Zellen vergleichen



  • YumiFerrari schrieb:

    noch eine Frage... wie kann ich das denn mit meinem Code in Verbindung bringen? ich hab so einiges geschrieben ....

    Du hast dies geschrieben

    YumiFerrari schrieb:

    getline(MyFile, String);
        if (String != Line) // If the line is not empty
        {
            Line = String;
            pointer_mychar = &String[0];
            pointer_mychar = strtok(pointer_mychar, delimiter);
            int i=0;
            int pairfind = 0;
    
            while(pointer_mychar != NULL)
            {
                if (i>1 && i<4) // Spalte Name and Address
                {
                    if (pairfind == 0) {
                        Name = newString;// der neu zusammen gesetzte string
                        pairfind = 1;
                    } else if (pairfind == 1) { // <====== hier fehlte das 'if'
                        Address = pointer_mychar; // Spalte Adresse
                        pairfind =2;
                    }
                    pointer_mychar = strtok(NULL, delimiter);
                    i++;
                }
    

    streng genommen macht das genau das was folgende zwei Zeilen machen:

    int level;
        MyFile >> level >> Name >> Address
    

    mehr ist es nicht!

    Was willst Du jetzt 'zusammenfügen'?

    Gruß
    Werner



  • im ernst????? ahahaha ich saß so lange an diesen paar zeilen 😞 hehe egal... so lern ich das ja zumindest....

    also ich soll eine csv datei einlesen und diese in eine map laden. nur ich hab mehrere namen die sich wiederholen mit einem anderen value aber. das hab ich ja schon geschrieben gehabt. daher wollte ich die levels mit berücksichtigen.....

    hier ist mein code.....

    typedef struct ODK_DATA_STRUCT
    {
    unsigned char dataType; // Data Type of memory
    ....
    } ODK_DATA_STRUCT; // Data structure for use with Read/Write functions
    // Self defined

    #define FILEPATH "..." // Hier bitte dateipfad einfügen
    #define MinColumnSize 1
    #define MaxColumnSize 4

    class TableReader {
    std::map<string, ODK_DATA_STRUCT> dataMap;

    public:
    ODK_DATA_STRUCT dataStructForShortName(string shortName);
    void getAddress(string searchname);
    TableReader();
    ~TableReader();

    private:
    map<string, ODK_DATA_STRUCT> loadMapFromCSV();
    };

    unsigned short shortFromString(string string) {

    stringstream ss(string);
    unsigned short i;
    if( (ss >> i).fail() )
    {
    //error
    //cout << "Error transcoding string " << string << "to number" << endl;
    return i;
    } else {

    return i;
    }

    }

    void replaceAll(std::string& str, const std::string& from, const std::string& to) {
    if(from.empty())
    return;
    size_t start_pos = 0;
    while((start_pos = str.find(from, start_pos)) != std::string::npos) {
    str.replace(start_pos, from.length(), to);
    start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
    }
    }

    void split(const string& s, char c, vector<string>& v) {
    // Used to split strings by given delimiter (for analyzing the rtName)
    string::size_type i = 0;
    string::size_type j = s.find(c);
    while (j != string::npos) {
    v.push_back(s.substr(i, j-i));
    i = ++j;
    j = s.find(c, j);
    if (j == string::npos)
    v.push_back(s.substr(i, s.length( )));
    }
    }

    TableReader::TableReader() {
    dataMap = loadMapFromCSV();
    }

    TableReader::~TableReader() {
    // delete dataMap;
    }

    map<string, ODK_DATA_STRUCT> TableReader::loadMapFromCSV ()
    {
    ifstream MyFile;
    string String;
    int z=0; // Used for endless while loops
    string Zeile = " ";
    char delimiter[] = ";";
    char* pointer_mychar;
    map<string, ODK_DATA_STRUCT> names;

    MyFile.open (FILEPATH);
    if (!MyFile)
    {
    printf ("Fehler beim Oeffnen der Datei!\n");
    throw 10;
    }
    else
    // printf ("Die Datei wurde geoeffnet!\n");

    MyFile.seekg (0, ios::beg);

    while(z<1)
    {

    string shortName; // The short name given in the CSV file
    string rtName; // The rtName given in the CSV file
    string datatypeStringFromTable; // The data Type given in the CSV
    int dataTypeNumRep; // An integer representation of the datatypeStringFromTable
    ODK_DATA_STRUCT dataStruct; // The data struct to be filled
    vector<string> v; // Initing the vector where we are going to put the two parts of the rtName

    getline(MyFile, String);
    if (String != Zeile) // If the line is not empty
    {
    Zeile = String;
    pointer_mychar = &String[0];

    pointer_mychar = strtok(pointer_mychar, delimiter);

    int i=0;
    int pairfind = 0;

    while(pointer_mychar != NULL)
    {
    if (i>MinColumnSize && i< MaxColumnSize) // Reading column 2-4 only.
    {

    if (pairfind == 0) {
    shortName = pointer_mychar; // First collum is the short Name
    pairfind = 1;
    } else if(pairfind == 1) {
    rtName = pointer_mychar; // Second collum is the rtName which will be analyzed here
    size_t position =rtName.find("]");
    rtName.erase(0, position+1);

    split(rtName, ',', v); // Splitting by a ,

    pairfind = 2;
    } else {
    datatypeStringFromTable = pointer_mychar;

    dataTypeNumRep = i;
    pairfind = 0; // Resetting pairfind for a new round
    }
    }
    pointer_mychar = strtok(NULL, delimiter);

    i++;
    }
    } else {
    break;
    }

    string firstPartOfrtName;
    string secondPartOfrtName;

    if (v.size() == 2) {
    firstPartOfrtName = v[0];
    secondPartOfrtName = v[1];
    } else {
    firstPartOfrtName = "";
    secondPartOfrtName = "";
    }

    if (firstPartOfrtName.find("DB") != string::npos) {
    dataStruct.memoryArea = ODK_MEM_AREA_DB;
    replaceAll(firstPartOfrtName, "DB", "");
    dataStruct.dbNumber = shortFromString(firstPartOfrtName);

    } /hier folgen noch ein paar typen*/

    /* Second part of RTName after the comma */

    if (secondPartOfrtName.find("STRING") != string::npos) {
    replaceAll(secondPartOfrtName, "STRING", "");
    dataStruct.dataType = ODK_DATA_TYPE_STRING;
    vector<string> p;
    if (secondPartOfrtName.find(".") != string::npos ) {
    split(secondPartOfrtName, '.', p);
    if (p.size() >= 1) {
    dataStruct.areaOffset = shortFromString(secondPartOfrtName);

    dataStruct.maxSize = shortFromString(p[1]);
    }
    }

    else {
    dataStruct.areaOffset = shortFromString(firstPartOfrtName);
    }
    /*hier folgen wiederum weitere typen*/

    names.insert(std::pair<string, ODK_DATA_STRUCT>(shortName,dataStruct));
    // Inserting finished pair into map

    }

    cout << "Read Process Complete!" << endl; // Debbung logs
    cout << "Map size: " << names.size() << endl;
    MyFile.close(); // Datei wird geschlossen
    return names;
    }

    ODK_DATA_STRUCT TableReader::dataStructForShortName(string shortName){

    ODK_DATA_STRUCT dataStruct = dataMap[shortName];
    return dataStruct;
    }

    int main ()
    { TableReader tableReader;
    while (true) {
    cout << "Enter string to search for" << endl;
    string searchString;
    cin >> searchString;

    cout << "Data Type: " << dataTypeName << endl;
    cout << "Quantity: " << dStruct.quantity << endl;
    cout << "db Number: " << dStruct.dbNumber << endl;
    cout << "Memory Area: " << memAreaName << endl;
    cout << "Area Offset: " << dStruct.areaOffset << endl;
    printf ("bitNumber: %d\n", dStruct.bitNumber );
    //cout << "pBuff: " << dStruct.pBuff << endl;
    cout << "max Size: " << dStruct.maxSize << endl;
    // cout << "status: " << dStruct.status << endl;

    cout << "------------------------------------" << endl;
    }

    return 0;
    }



  • hier betrachte ich die levels gar nicht.... und das war die frage, wie ich das hier irgendwie mit berücksichtigen kann und dann eben wie bei dem einen beispiel von benutzer abfe die neuen keys, die nach dem level zusammen gesetzt worden sind ind die map lade. dann kann ich bei der eingabe auch den zusammengesetzen key eingeben und bekomme die richtige adresse raus.

    ich hoffe ich hab mich jetzt nicht unklar ausgdrückt oder so



  • hat einer ne idee???? ich bin immer noch nicht schlauer geworden.... 😞



  • Hallo YumiFerrari,

    YumiFerrari schrieb:

    hat einer ne idee???? ich bin immer noch nicht schlauer geworden.... 😞

    nein - bist Du anscheinend nicht.
    Wenn Du hier Hilfe bekommen möchtest, so biete es sich an, konkrete Fragen zu einzelnen Code-Stellen oder ähnliches zu stellen. Du kannst auch fragen, wie man ein bestimmtes Problem löst, aber Du stellst hier Code ein, der schwer zu lesen ist, Syntaxfehler enthält und bei dem nicht nachzuvollziehen ist, in wie weit der Code was mit Deinem anfangs geschilderten Problem zu tun hat.

    In Deinem ersten Beitrag dieses Threads geht es z.B.: um Level, Name und Adresse. Davon ist in Deinem Code nichts mehr zu finden.

    YumiFerrari schrieb:

    hier betrachte ich die levels gar nicht.... und das war die frage, wie ich das hier irgendwie mit berücksichtigen kann und dann eben wie bei dem einen beispiel von benutzer abfe die neuen keys, die nach dem level zusammen gesetzt worden sind ind die map lade. dann kann ich bei der eingabe auch den zusammengesetzen key eingeben und bekomme die richtige adresse raus.

    Von 'Name' und 'Adresse' ist nichts mehr zu sehen, dafür scheinen in der Datei Dinge wie "STRING" und "]" vor zukommen. Wie sieht denn diese Datei jetzt aus - das gleiche Format wie oben kann es nicht sein.

    Es wird Dir niemand sagen können, wie/wo der Level 'zu berücksichtigen' ist, weil gar nicht klar ist, was der Code unten mit der Problemschilderung oben zu tun hat.

    Versuche doch mal, uns zu erklären, was der Input Deines geplanten Programms ist und was als Output erwartet wird; am besten an Hand eines Beispiels.

    Gruß
    Werner



  • Hey,

    danke für die rückmeldung.... also das mit level name adresse war eigentlich nur ein beispiel gewesen....

    den code habe ich reingestellt, weil ich nicht genau wusste, wo ich genau die veränderung vornehmen kann.... aber grad bin ich soweit, dass ich weiß, wo genau ich das ansetzen muss.....gib mir kurz zeit, dann schilder ich den aktuellen standpunkt mit einer konkreten frage



  • die spalten sehen so aus.
    tagtype; level; shortname; rtname

    Die lese ich alle ein, was auch soweit klappt. Nun ist das so, dass ich verschiedene Levels (genau 6)habe. von denen ist es abhängig, was für ein Shortname herraus kommt. daher habe ich versucht levelContent1 - levelContent6 anzulegen, dass der inhalt in den pointer geladen wird.

    hierbei bekomme ich eine fehlermeldung. error C2440: '=': 'char *' kann nicht in 'int' konvertiert werden
    woran liegt das denn?

    C++ Code:

    getline(MyFile, String); 
            if (String != Line) // If the line is not empty
            {
                Line = String;
                pointer_mychar = &String[0];
                pointer_mychar = strtok(pointer_mychar, delimiter);
                int i=0;
                int pairfind = 0; 
    
                while(pointer_mychar != NULL) 
                {
                    if (i>=MinColumnSize && i<  MaxColumnSize) // Reading necessary column only.  
                    {  
                        if (pairfind == 0) {  
                            tagType = pointer_mychar; // First column is the tagType
    			pairfind = 1;
                        } else if (pairfind == 1) {  
                            level = pointer_mychar; // Second column is the level
                            pairfind = 2;
                        } else if (pairfind == 2) {  
                            shortName = pointer_mychar; // third column is the short Name
    
    			string levelContent1;
    		        string levelContent2;
    			string levelContent3;
    			string levelContent4;
    			string levelContent5;
    			string levelContent6;
    
    			if (level = 1){
    			    levelContent1 = pointer_mychar;
    			}
    			else if ( levelContent2 = 2){
    			     levelContent = pointer_mychar;
    			}
    			else if ( levelContent3 = 3){
    			     levelContent = pointer_mychar;
    			}
    			else if ( levelContent4 = 4){
    			     levelContent = pointer_mychar;
    			}
    			else if ( levelContent5 = 5{
    			     levelContent = pointer_mychar;
    			}
    			else if ( levelContent6 = 6{
    			     levelContent = pointer_mychar;
    			}
    
                            pairfind = 3;
                        } 
                        else if(pairfind == 3) {
                            rtName = pointer_mychar; // fourth column is the rtName which will be analyzed here
                            pairfind = 4;
                        } else {
                            datatypeStringFromTable = pointer_mychar;
    
                            dataTypeNumRep = i;
                            pairfind = 0; // Resetting pairfind for a new round
                        }
                    }
                    pointer_mychar = strtok(NULL, delimiter);
    
                    i++;
                }
            } else {
                break;
            }
    


  • Hallo YumiFerrari,

    Ich unterstelle mal, dass der genannte Compile-Error in den Zeilen 15 und/oder 18 und/oder 21 passiert.
    Das liegt daran, dass von den Variablen tagType , level oder shortName mindestens einer vom Typ int ist - und Du kannst keinen char* einem int zuweisen.

    Es wäre hilfreich, wenn Deine geposteten Codeschnipsel in sich vollständig sind; dazu gehören mindestens alle Typangaben der verwendeten Variablen.

    Gruß
    Werner



  • ..



  • .. irgendwie funktioniert das Editieren nicht mehr 😕



  • string tagType; // The tag type from the CSV file
            string level; // level from the csv file
            string shortName; // The short name given in the CSV file
            string rtName; // The rtName given in the CSV file
            string datatypeStringFromTable; // The data Type given in the CSV
            int dataTypeNumRep; // An integer representation of the datatypeStringFromTable
            ODK_DATA_STRUCT dataStruct; // The data struct to be filled
            vector<string> v; // Initing the vector where we are going to put the two parts of the rtName
    

    ich glaube das sollte es sein...

    bei mir zeigt es immer die zeilen ab 31 an... das mit dem levelContent... das habe ich auch neu hinzugefügt, weil ich den inhalt eben haben wollte.



  • hoppaallaaa ich seh ein fehler bei dem code.

    eigentlich sollte das so aussehen.

    if (level = 1){
    		levelContent1 = pointer_mychar;
    	}
    
    else if ( levelContent2 = 2){
    		levelContent2 = pointer_mychar;
    	}
    else if ( levelContent3 = 3){
    	        levelContent3 = pointer_mychar;
    	}
    else if ( levelContent4 = 4){
    		levelContent4 = pointer_mychar;
            }
    else if ( levelContent5 = 5{
    	        levelContent5 = pointer_mychar;
    	}
    else if ( levelContent6 = 6{
    		levelContent6 = pointer_mychar;
    	}
    


  • YumiFerrari schrieb:

    bei mir zeigt es immer die zeilen ab 31 an... das mit dem levelContent...

    Ah - stimmt, ich habe es vor lauter undefinierten Variablen nicht gleich gesehen.

    YumiFerrari schrieb:

    string level; // level from the csv file
        if (level = 1){
            levelContent1 = pointer_mychar;
        }
    

    hinter dem if wird nicht verglichen, sondern zugewiesen, wenn überhaupt muss es heißen

    string level; // level from the csv file
        if (level == "1"){
            levelContent1 = pointer_mychar;
        }
    

    .. die anderen Zeilen entsprechend

    Gruß
    Werner



  • also ich habe das jetzt so umgeändert, aber jetzt kommt folgende fehlermeldung

    error C2446: '==': Keine Konvertierung von 'const char *' in 'int' 😕



  • ich bin grad am überlegen, ob die logik stimmt... ich möchte ja gerne das anhand des levels der ShortName sich zusammen setzt. ( der Shortname soll sich zusammen setzen, weil ich später den als Key in meine map lade)
    dafür vergleiche ich immer den level und möchte dann den passenden shortName dem pointer zuweisen. muss ich dann bei der if () level hinschreiben oder levelContent ? level ist eigentlich die spalte bzw der der level der zeile von dem shortName und levelContent soll ja eigentlich der shortName sein.



  • YumiFerrari schrieb:

    also ich habe das jetzt so umgeändert, aber jetzt kommt folgende fehlermeldung

    error C2446: '==': Keine Konvertierung von 'const char *' in 'int' 😕

    .. das glaube ich nicht! poste mal den Code der Zeile mit der Fehlermeldung und die komplette Fehlermeldung.



  • ahhh sry, das funktioniert. das hatte eben nur mit meiner verwirrung zu tun gehabt, dass ich da levelContent1 hatte und nicht level. aber jetzt klappt das. 🙂 yeah danke 🙂

    nun komme ich aber zu der nächsten frage......

    ich lade shortname und rtname in die map. nur shortname kann ich leider nicht so in die map laden, weil die öfters mit der selben bezeichnung vorkommt. daher habe ich jetzt auch die levels mit eingelesen. nun möchte ich gerne, dass ich den genauen pfad zusammen setze...

    sprich das beispiel von anfangs...

    Level Name Adresse
    1 A 123
    2 B 234
    3 C 345
    3 D 456
    4 E 567
    3 F 678
    4 E 789

    Key rtName
    A 123
    A.B 234
    A.B.C 345
    A.B.D 456
    A.B.D.E 567
    A.B.F 678
    A.B.F.E 789

    Da hat mir ja auch der Benutzer abfe ein beispiel genannt.... hm aber ich dachte ich lege einfach eine medothe key an, bevor das in die map geladen wird. key setzt sich dann ja aus den shortnames zusammen. nur ich weiß jetzt nicht genau wie ich diese methode erstellen kann. sprich ich muss ja sagen, dass die levels immer vergleichen werden, damit man das zusammen setzen kann... hast du da vllt eine idee?



  • theoretisch habe ich den inhalt also was im shortname steht bei levelContent geladen. muss jetzt die levels immer abfragen und die dann zusammen setzen mit einem punkt dazwischen.... Wie kann man das am besten machen? dieses strcat ist nicht dafür geeignet oder?



  • YumiFerrari schrieb:

    theoretisch habe ich den inhalt also was im shortname steht bei levelContent geladen. muss jetzt die levels immer abfragen und die dann zusammen setzen mit einem punkt dazwischen.... Wie kann man das am besten machen? dieses strcat ist nicht dafür geeignet oder?

    Nun ja - strcat ist ein C-Funktion, mit der man Strings aneinander hängen kann.
    Jetzt befinden wir uns hier zum einen im C**++**-Forum und zum anderen hat Dir abfe bereits eine Lösung (in C++) vorgeschlagen, die knapp 20 Zeilen umfasst. Selbst wenn man dort die map noch hinzufügt, wird es keine 30 Zeilen lang werden.

    Du dagegen postest hier ein 300-Zeilen Programm, das den Namen 'Programm' nicht verdient und mit der Tendenz 'weiter wachsend'. Dieses Programm möchtest Du nun unbedingt erweitern, und von uns verlangst Du, Deinen Gedankengängen zu folgen, von denen Du uns immer wieder ein paar Brocken hinwirfst.

    YumiFerrari so wird das nichts!
    Versuche doch, Algorithmus und Programmcode von abfe zu verstehen. Wenn Du das hin bekommen hast, kannst Du es ja gerne noch mal coden. Wenn zu abfes Code Fragen sind, so frage.

    Gruß
    Werner

    PS.: das Aneinander-Hängen der Namen mit '.' geschieht bei abfe in Zeile 15.


Anmelden zum Antworten