Datei-> Spalte suchen , finden und die komplette Zeile ausgeben



  • Was sollen die zwei Klammern "((" am Anfang des Regex-Ausdrucks?



  • Carlos_Hafensänger schrieb:

    Er compiliert es

    man schreibt es "kompiliert", deutsches Wort, Duden und so. Alles andere sind Fabelwesen.

    Carlos_Hafensänger schrieb:

    "terminate called after throwing an instance of 'std::regex_error'
    what(): regex_error"

    Erwartest du jetzt, dass man dir regex erklärt?! RTFM!



  • Carlos_Hafensänger schrieb:

    der compiliert es mir nicht

    Der böse böse böse Compiler, so ein Böser... 😞



  • Sorry hatte die letzte Zeit viel um die Ohren .
    Habe mal einen anderen Ansatz , was sagt ihr dazu

    int main()
    {
    string line;
    ifstream file("c://users//xy//desktop//bsp.txt");
    
    while(file.good())
    {
        while(getline(file,line))
        {
    
        string a,b,c,d,e;
        file >>a>>b>>c>>d>>e;
    
        string ang;
    
        cout <<"ang:";
        cin >> ang;
    
        if(ang=line.find(a)||line.find(b)...)
        {
            cout <<"gefunden";
        }
    }
    }
    
    }
    

    Will lediglich nur nach einer Spalte suchen
    Aber die Zeile mit "if(...)" gibt er mir als Fehler an



  • Na, Er wird wohl etwas mehr dazu sagen.



  • hast du in deinem Quelltext da auch wirklich "..." stehen.

    Außerdem glaube ich nicht, dass du in dem if wirklich eine Zuweisung machen möchtest.



  • Nein
    ist eigentlich nur die Fortführung von dem logischem Operator bis e
    Wieso kann ich die Schleife ausführen wenn ang ein integer ist
    und bei String , gibt er mir eine Fehlermeldung aus .
    Verstehe ich echt nicht



  • Carlos_Hafensänger schrieb:

    #include <regex>
    #include <fstream>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        regex expr(
                   R"(([A-Z0._%+-])",regex_constants::icase);
    
        string line, fname;
    
        cout <<"Dateiname angeben:";
        getline(cin, fname);
        ifstream file(fname);
        if(!file){return -1;}
    
        smatch m;
    
        while(getline(file,line))
        {
            if(regex_search(line,m,expr))
            {
                if(m.size() == 1)
                {
                    cout << "Angabe:" << m.str(0) <<endl;
                }
            }
        }
    }
    

    Leute ich sehe mein Fehler nicht ?! der compiliert es mir nicht
    AUSGABE : "terminate called after throwing an instance of 'std::regex_error'
    what(): regex_error"

    zu meinem Hauptproblem:
    (steht im Titel)

    Mod-Edit: Code-Tags.

    Die Exception wird geworfen, weil dein Regex-Ausdruck nicht korrekt ist (sie wird beim Ausführen des Programms geworfen, dann ist der Kompiliervorgang abgeschlossen).

    Th69 hat dich schon auf die richtige Spur gebracht mit seiner Frage nach den zwei Klammern zu Beginn, denn es wird nur eine geschlossen.
    Falls du es nicht weisst; mit R"()" wird ein String-Literal angegeben, welches "raw" ist und nicht escaped werden muss/darf (der eigentliche String kommt zwischen die Klammern). Wobei die Klammern Geschmacksache sind - man könnte AFAIK auch ein anderes Zeichen nehmen (oder sogar mehrere), z. B. R"**" (der eigentliche String kommt zwischen die Sterne).



  • Wobei die Klammern Geschmacksache sind - man könnte AFAIK auch ein anderes Zeichen nehmen (oder sogar mehrere), z. B. R"**" (der eigentliche String kommt zwischen die Sterne).

    C++ ist nicht Perl, wo man String mit q(string), q!String!, q<String>, q*String* usw. erzeugen kann.

    In C++ kommt der String zwischen die Klammern!

    R" + irgendwas + ( + eigentlicher String + ) + irgendwas_wiederholt + ";
    d.h. folgendes ist identisch:

    std::cout << R"(hallo welt)" << '\n';
    std::cout << R"x(hallo welt)x" << '\n';
    std::cout << R"blubberdieblubb(hallo welt)blubberdieblubb" << '\n';
    std::cout << R"*+45(hallo welt)*+45" << '\n';
    std::cout << R"""""(hallo welt)""""" << '\n';
    

    Man suche sich davon das lesbarste heraus 😉



  • wob schrieb:

    ...

    Hab ich ja geschrieben. Aber danke für die detailliertere Ausführung.

    Edit: Ok, ich habe nicht genau das geschrieben, was du jetzt hervorgehoben hast.
    Edit2: I agree.



  • Carlos_Hafensänger schrieb:

    Wieso kann ich die Schleife ausführen wenn ang ein integer ist und bei String , gibt er mir eine Fehlermeldung aus .
    Verstehe ich echt nicht

    string.find() gibt die Position des gesuchten Teilstrings zurück

    In deiner Bedingung steht:

    if(ang=line.find(a)...
    

    Das "=" ist eine Zuweisung. Das Ergebnis von find() wird also "ang" zugewiesen und das geht nicht, wenn "ang" ein string ist.

    Du willst vermutlich vergleichen. Das geht mit "==".



  • Sorry , dass ich so spät zurück schreibe .
    Danke nochmals für die Hilfe

    Hab es jetzt lösen können.

    while(getline(Myfile,line))
               {
                   istringstream stream(line);
                   vector<string>column;
                   string element;
    
                   while(getline(stream,element,'\t'))
                   {
                       column.push_back(element);
                       if(((offset = element.find(suchen,0))) != string::npos)
                        {
                           // cout <<"Wort gefunden:\n" << suchen<<"\n"<<element << endl;
    
                        }
                   }
    
               }
    

    Nun habe ich das Problem:
    ich kann jetzt nach einem Wort suchen und auch die entsprechende Zeile ausgeben , nur leider würde ich gerne die Spalten der Zeile , die durch ein Kommata getrennt sind , in einzelne Variablen speichern um beispielsweise von einigen bestimmen Spalten den Average ausrechnen zu können



  • Carlos_Hafensänger schrieb:

    Nun habe ich das Problem:
    ich kann jetzt nach einem Wort suchen und auch die entsprechende Zeile ausgeben , nur leider würde ich gerne die Spalten der Zeile , die durch ein Kommata getrennt sind , in einzelne Variablen speichern um beispielsweise von einigen bestimmen Spalten den Average ausrechnen zu können

    Der Suchbegriff ist "split string". Da sollte es einige Ergebnisse dazu geben...



  • danke 😃

    habe es so weit wie möglich geschafft und nun wollte ich int in string umwandeln mit to_string, habe auch mal ein wenig im Internet mich schlau gemacht , leider nichts gefunden.
    Ich zeige euch mal mein Codeschnipsel

    //calc average
            int length = searchResults.size();
            vector<string> result;
            double secondRow = 0;
            double thirdRow = 0;
            for (vector<string> line : searchResults) {
                secondRow += atoi(line.at(1).c_str());
                thirdRow += atoi(line.at(2).c_str());
            }
    
            //Resultat zusammensetzten
            result.insert(result.begin(), suchen);
            result.insert(result.end(),to_string(secondRow / length));
            result.insert(result.end(),to_string (thirdRow / length));
    

    die dreizehnten Zeile wird mir als Fehler angezeigt , die Meldung : to_string was not declared in this Scoop

    Leider finde ich mei Fehler nicht , habe auch include <sstream>


  • Mod

    to_string benötigt den Header <string>



  • Habe ich auch im Header , trotzdem geht es nicht



  • C++ 11 einschalten oder neueren Compiler installieren.



  • Habe den Compiler :
    GNU GCC Compiler
    Have g++ follow the C++11 ISO C++ language Standard [std=c++11]



  • Carlos_Hafensänger schrieb:

    Habe den Compiler :
    GNU GCC Compiler

    Dir ist aber schon aufgefallen, dass Software (aus gutem Grund) eine Versionsnummer hat?

    manni66 schrieb:

    C++ 11 einschalten oder neueren Compiler installieren.



  • Muss echt gestehen , dass ich gerade etwas verwirrt bin .
    Ich dachte der Compiler wäre der aktuellste und somit auch der Mächtigste.
    Könntest du es noch einmal für Dummies erläutern , falls du die Zeit dafür hast
    DANKEE 😃


Anmelden zum Antworten