Summieren und sortieren



  • Cevin19994 schrieb:

    Guten Tag ich brauche wieder mal eure Hilfe 🙂
    ich möchte gerne werte in einer datei nach datum summieren und sortieren wie stell ich das an ?

    Im Prinzip kannst Du eine std::map zu Hilfe nehmen, wobei Du das Datum als Schlüssel benutzt und für jedes MD-Objekt aus der Datei auf das MD-Element in der map mit dem gleichen Schlüssel aufaddierst. Das passiert in Zeile 56 im Listing unten.

    Hast Du denn die Links, die ich Dir genannt habe, alle schon durchgearbeitet? Du stellst diesbezüglich gar keine Fragen.

    Ich habe Dir hier das Prinzip skizziert; das ist keine fertige Lösung:

    #include <iostream>
    #include <iomanip> // std::setw
    #include <string>
    #include <map>
    #include <sstream>
    
    struct MD  // string für datum und doubles für die werte
    {
        MD()
            : datum(), hours_worked(0.), filescreated(0.)
        {}
        std::string datum;
        double hours_worked;
        double filescreated;
    
        // Hallo Cevin; hast Du <http://magazin.c-plusplus.net/artikel/%DCberladung%20von%20Operatoren%20in%20CPlusPlus%20%28Teil%201%29> gelesen?
        MD& operator+=( const MD& b )
        {
            hours_worked += b.hours_worked;
            filescreated += b.filescreated;
            datum = b.datum;
            return *this;
        }
        static std::string head()
        {
            return "Datum        |   Stunden gearbeitet | Dateien erstellt ";
        }
    };
    std::istream& operator>>( std::istream& in, MD& md ) // input
    {
        return in >> md.datum >> md.hours_worked >> md.hours_worked;
    }
    std::ostream& operator<<( std::ostream& out, const MD& md ) // output
    {
        using std::setw;
        out << std::fixed << std::setprecision( 2 );
        out << setw(13) << std::left << md.datum << std::right << "|" << setw(8) << md.hours_worked << "              |" << setw(6) << md.filescreated;
        return out;
    }
    
    int main()
    {
        using namespace std;
        map< string, MD > mds;
        istringstream in(
            "2012-10-04 0    2\n"
            "2012-10-04 0    0.5\n"
            "2012-10-04 1.25 0\n"
            "2012-10-03 0    1\n"
            "2012-10-03 0    3\n"
            "2012-10-04 1.5  0\n"
            "2012-10-04 10   0\n"
            );
        for( MD md; in >> md; )
        {
            mds[md.datum] += md; // sortiert summieren
        }
        if( !in.eof() )
            cerr << "Fehler beim Lesen" << endl;
    
        // -- ausgeben:
        cout << MD::head() << endl;
        for( map< string, MD >::iterator i = mds.begin(); i != mds.end(); ++i )
        {
            cout << i->second << endl;
        }
    
    	cin.get();
    	return 0;
    }
    

    Cevin19994 schrieb:

    ich persöhnlich kenn mich mit streamen aus ...

    dann ist es ja kein Problem für Dich, den Code oben in Dein Programm zu integrieren.

    Im Übrigen haben SeppJ und KasF Recht.

    Gruß
    Werner



  • Danke Werner 🙂
    Ja die Links habe ich mir angesehen 🙂
    Ich denke mit dem was du hier gepostet hast werde ich endlich mein (eig ja unser aller 😛 ) Programm fertig kriegen
    Ps : ich weiß das sie Recht haben irgendwo ... nur wird es ja wohl eine andere Art geben mir es zu sagen oder ? 🙂



  • Hey Leute ich hatte mit Werners Vorschlag ein Problem und habe es nicht hingekriegt bevor ich wieder blöde fragen stelle 😛 und euch nerve hab ich es alternativ gelöst und habe meine fertige csv im programm noch mal geöffnet und für jede datei eihene strings und doubles geschrieben und sie einfach addiert

    myFile.open ("C:/valueextractor/extractor.csv");
    	   if (myFile)
    	   {
    
    	   string  mdd4 (md.datum) ;
    	   double mdf4 (md.filescreated) ;
    	   double mdh4 (md.hours_worked);
    
    	   cout << endl << mdd2 << "  |  " << mdh1 <<"  |  "  << mdh2<< "  |  "<< mdh3 <<"  |  " << mdh4 << "|-|-| "  << mdf1 <<"  |  "<< mdf2 <<"  |  "<< mdf3 << "  |  "<< mdf4 << endl ; 
    	   cout << endl << mdd2 << "  |  " << mdh1 + mdh2 + mdh3 + mdh4 << "  |  "  << mdf1 + mdf2 + mdf3 + mdf4 << endl ; 
    
    }
    
    	myFile.close();
    

    und er rechnet ja auch richtig nur wenn eine meiner md's mehrere zeilen hat liest er wieder nur jeweils eine in meinen neuen doubles ein
    wodurch er wieder nicht richtig rechnet .. hier nochmal der ganze code

    #include <iostream>
    #include <istream> 
    #include <fstream> 
    #include <limits>  
    #include <string>
    
    struct MD  // string für datum und doubles für  die werte in zahlen
    { 
        std::string datum; 
        double hours_worked; 
        double filescreated; 
    };
    
    namespace 
    { 
        const std::streamsize ALL = std::numeric_limits< std::streamsize >::max(); 
    }; 
    // filter :P
    std::istream& operator>>( std::istream& in, MD& md ) 
    { 
        in.ignore( ALL, '[' ) >> md.datum; 
        std::string token; 
        if( getline( in.ignore( ALL, '|' ), token, '=' ) ) 
        { 
            md.hours_worked = 0.;  
            md.filescreated = 0.; 
            if( token == "hours_worked" ) 
                in >> md.hours_worked; 
            else if( token == "filescreated" ) 
                in >> md.filescreated; 
            else 
                in.setstate( std::ios_base::failbit ); 
        } 
        return in; 
    }
    struct Komma : public std::numpunct< char > 
    { 
    protected: 
        virtual char_type do_decimal_point() const 
        { 
            return ','; 
        } 
    };
    
    int main() 
    { 
        using namespace std; 
        ifstream fin ("C:/valueextractor/valueextractor/testfolder/days/2012-10-03.md") ; 
       fin.imbue( locale( fin.getloc(), new Komma ) );
        if( !fin.is_open() ) 
        { 
            cerr << "Fehler beim Oeffnen der Datei" << endl; 
    
            return -2; 
        } 
    
    	//stream öffnen
              ofstream myFile;  
           myFile.open ("C:/valueextractor/extractor.csv");
    
       MD md;
       while (  fin >> md ) 
    
       {  
               // md's   auswerten
               cout << "Datum        |Stunden gearbeitet | Dateien erstellt " << endl ;
               cout << md.datum << "|          " << md.hours_worked << "                |          " << md.filescreated << endl ;    
    
    		   //stream schreiben
    		   if (myFile)
    
              myFile << "Datum        |   Stunden gearbeitet | Dateien erstellt " << endl;
              myFile << md.datum << "|          " << md.hours_worked << "     |             " << md.filescreated << endl ; 
    
    		  //MD'D summieren  
    
        } 
    
           // stream schließen  
           myFile.close();
    
          string  mdd1 (md.datum) ;
    	   double mdf1 (md.filescreated) ;
    	   double mdh1 (md.hours_worked);
    
    	   if( fin.eof() ) 
        { 
    
           } 
    
    //------------------------------------------2222222222222222222222222222222222------------------------------------------------------------
    
    	   ifstream fin1 ("C:/valueextractor/valueextractor/testfolder/days/2012-10-04.md") ; 
       fin1.imbue( locale( fin1.getloc(), new Komma ) );
        if( !fin1.is_open() ) 
        { 
            cerr << "Fehler beim Oeffnen der Datei" << endl; 
    
            return -2; 
        } 
    
    	//stream öffnen
    
           myFile.open ("C:/valueextractor/extractor.csv", std::ios::app);
    
       while (  fin1 >> md ) 
    
       {  
               // md's   auswerten
               cout << "Datum        |Stunden gearbeitet | Dateien erstellt " << endl ;
               cout << md.datum << "|          " << md.hours_worked << "                |          " << md.filescreated << endl ;    
    
    		   //stream schreiben
    		   if (myFile)
    
              myFile << "Datum        |   Stunden gearbeitet | Dateien erstellt " << endl;
              myFile << md.datum << "|          " << md.hours_worked << "     |             " << md.filescreated << endl ; 
    
    		  //MD'D summieren  
    
        } 
    
           // stream schließen  
           myFile.close();
    
          string  mdd2 (md.datum) ;
    	   double mdf2 (md.filescreated) ;
    	   double mdh2 (md.hours_worked);
    
    	   if( fin1.eof() ) 
        { 
    
           }
    //-----------------------------------------------3333333333333333333333333333333333333333---------------------------------------------
    	   ifstream fin11 ("C:/valueextractor/valueextractor/testfolder/meetings/MeetingForWikiDown1.md") ; 
       fin11.imbue( locale( fin11.getloc(), new Komma ) );
        if( !fin11.is_open() ) 
        { 
            cerr << "Fehler beim Oeffnen der Datei" << endl; 
    
            return -2; 
        } 
    
    	//stream öffnen
    
           myFile.open ("C:/valueextractor/extractor.csv", std::ios::app);
    
       while (  fin11 >> md ) 
    
       {  
               // md's   auswerten
               cout << "Datum        |Stunden gearbeitet | Dateien erstellt " << endl ;
               cout << md.datum << "|          " << md.hours_worked << "                |          " << md.filescreated << endl ;    
    
    		   //stream schreiben
    		   if (myFile)
    
              myFile << "Datum        |   Stunden gearbeitet | Dateien erstellt " << endl;
              myFile << md.datum << "|          " << md.hours_worked << "     |             " << md.filescreated << endl ; 
    
    		  //MD'D summieren  
    
        } 
    
           // stream schließen  
           myFile.close();
    
             string  mdd3 (md.datum) ;
    	   double mdf3 (md.filescreated) ;
    	   double mdh3 (md.hours_worked);
    
    	   if( fin11.eof() ) 
        { 
    
           }
    //-------------------------------------------------4444444444444444444444444444444444444-------------------------------------------------
    	   ifstream fin111 ("C:/valueextractor/valueextractor/testfolder/meetings/MeetingForWikiDown2.md") ; 
       fin111.imbue( locale( fin111.getloc(), new Komma ) );
        if( !fin111.is_open() ) 
        { 
            cerr << "Fehler beim Oeffnen der Datei" << endl; 
    
            return -2; 
        } 
    
    	//stream öffnen
    
           myFile.open ("C:/valueextractor/extractor.csv", std::ios::app);
    
       while (  fin111 >> md ) 
    
       {  
               // md's   auswerten
               cout << "Datum        |Stunden gearbeitet | Dateien erstellt " << endl ;
               cout << md.datum << "|          " << md.hours_worked << "                |          " << md.filescreated << endl ;    
    
    		   //stream schreiben
    		   if (myFile)
    
              myFile << "Datum        |   Stunden gearbeitet | Dateien erstellt " << endl;
              myFile << md.datum << "|          " << md.hours_worked << "     |             " << md.filescreated << endl ; 
    
    		  //MD'D summieren  
    
        } 
    
           // stream schließen  
           myFile.close();
    
    	   if( fin111.eof() ) 
        { 
    
           }
    
    //-------------------------------------------------ende---------------------------------------------------------------------------------
    
           myFile.open ("C:/valueextractor/extractor.csv");
    	   if (myFile)
    	   {
    
    	   string  mdd4 (md.datum) ;
    	   double mdf4 (md.filescreated) ;
    	   double mdh4 (md.hours_worked);
    
    	   cout << endl << mdd2 << "  |  " << mdh1 <<"  |  "  << mdh2<< "  |  "<< mdh3 <<"  |  " << mdh4 << "|-|-| "  << mdf1 <<"  |  "<< mdf2 <<"  |  "<< mdf3 << "  |  "<< mdf4 << endl ; 
    	   cout << endl << mdd1 << "  |  " << mdh1 + mdh2 + mdh3 + mdh4 << "  |  "  << mdf1 + mdf2 + mdf3 + mdf4 << endl ; 
    
    }
    
    	myFile.close();
    
        getchar () ;
        return 0; 
    }
    

    hier die werte die in der csv stehen

    Datum        |   Stunden gearbeitet | Dateien erstellt 
    2012-10-04|          0 	|             2 
    Datum        |   Stunden gearbeitet | Dateien erstellt 
    2012-10-04|          0 	|             0.5 
    Datum        |   Stunden gearbeitet | Dateien erstellt 
    2012-10-04|          1.25 	|             0 
    Datum        |   Stunden gearbeitet | Dateien erstellt 
    2012-10-03|          0 	|             1 
    Datum        |   Stunden gearbeitet | Dateien erstellt 
    2012-10-03|          0 	|             3 
    Datum        |   Stunden gearbeitet | Dateien erstellt 
    2012-10-04|          1.5 	|             0 
    Datum        |   Stunden gearbeitet | Dateien erstellt 
    2012-10-04|          10 	|             0
    

    und er rechnet nur zeile 2 ,10 , 12 , 14 . die anderen 3 werte zeilen liest er nicht ein in meine neuen doubles wieso ?
    achja ps das giebt er zum schlus in die csv aus

    2012-10-04  |  0  |  1.25  |  1.5  |  10|-|-| 3  |  0  |  0  |  0
    
    2012-10-03  |  12.75  |  3
    

    sieht jemand mein Problem ..
    (außer das ich den code nicht verstehe ... gewisse foren mitglieder fühlen sich schon angesprochen 😉 )



  • .. ja ich sehe Dein Problem 😉

    immer da wo im Code

    //MD'D summieren
    

    steht, musst Du auch Code hinschreiben, der die MDs summiert.



  • Sagst du das weil du der meinung bist der muss dahin oder weil ich das kommentar dort verfasst habe ? 😃 😉 .. aber nein klappt nicht ... es war ursprünglich anders geplannt ich habe nur vergessen die kommentare zu löschen 🙂



  • ich bin der Meinung, das Summieren muss an diese Stellen. Was klappt nicht?



  • Besserwessi schrieb:

    ich bin der Meinung, das Summieren muss an diese Stellen. Was klappt nicht?

    Das summieren dort 🙂 auf jedenfall nicht auf meiner art 😕 fällt dir eine bessere art ein ? 🙂
    gruß cevin 🙂



  • Summieren geht mit + 😉
    Weißt Du, dass man mit der Information 'klappt nicht' keinerlei Hilfestellung geben kann.



  • Besserwessi schrieb:

    Summieren geht mit + 😉
    Weißt Du, dass man mit der Information 'klappt nicht' keinerlei Hilfestellung geben kann.

    Da hst du villt Recht 😃
    Also ich überschreite damit gültigkeitsbereiche ...
    deswegen summiere ich ganz unten alles zusammen



  • Cevin19994 schrieb:

    Also ich überschreite damit gültigkeitsbereiche ...

    was bedeutet das - gibt es eine Fehlermeldung, Crash irgendwas?

    Cevin19994 schrieb:

    deswegen summiere ich ganz unten alles zusammen

    nein, Du summierst nur den jeweils zuletzt gelesenen Wert aus jeder Datei. Wo glaubst Du denn geschieht das Summieren von zwei Werten aus einer Datei in Deinem Code.


  • Mod

    Besserwessi schrieb:

    Cevin19994 schrieb:

    Also ich überschreite damit gültigkeitsbereiche ...

    was bedeutet das - gibt es eine Fehlermeldung, Crash irgendwas?

    Das wird dir klar, wenn du seine letzten beiden Threads liest. Er weiß nicht wirklich, was ein Gültigkeitsbereich ist. Er wartet darauf, dass ihm jemand eine Komplettlösung macht. Entweder gib sie ihm oder lass es. Aber versuch nicht die pädagogische Tour. Sie funktioniert nicht. Da wurden hier im Forum schon 13 Seiten für verschwendet.



  • Zu dem gültigkeitsbereich : Ähm ja es kommem mehrere fehlermeldungen das meine md's nicht deklariert sind

    wo das summieren geschied ganz unten ?

    myFile.open ("C:/valueextractor/extractor.csv");
    	   if (myFile)
    	   {
    
    	   string  mdd4 (md.datum) ;
    	   double mdf4 (md.filescreated) ;
    	   double mdh4 (md.hours_worked);
    
    	   cout  << endl << mdd1 << "  |  " << mdh1  << "  |  " << mdf1 << endl ; 
    	   cout  << mdd2 << "  |  " <<  mdh2 + mdh3 + mdh4 << "  |  " <<  mdf2 + mdf3 + mdf4 << endl ; 
    
    	   myFile << mdd1 << "  |  " << mdh1  << "  |  " << mdf1 << endl ; 
    	   myFile  << mdd2 << "  |  " <<  mdh2 + mdh3 + mdh4 << "  |  " <<  mdf2 + mdf3 + mdf4 << endl ;
    
    }
    
    	myFile.close();
    

    ja das ich jeweils nur den zuletzt gemessenen wert summiere weiß ich ja

    ich habe ja hinter jeder meiner eingelesenen dateien nochmal den inhalt in ein
    neu erstellte string oder double geschrieben und die summiere ich unten zusammen .. also lese ich je den zuletzt gemessenen wert in meine neu erstellte strings oder doubles ?
    wie kann ich denn nicht das zuletzt gemessene sondern alles in die neuen strings und doubles schreiben ?



  • SeppJ schrieb:

    Besserwessi schrieb:

    Cevin19994 schrieb:

    Also ich überschreite damit gültigkeitsbereiche ...

    was bedeutet das - gibt es eine Fehlermeldung, Crash irgendwas?

    Das wird dir klar, wenn du seine letzten beiden Threads liest. Er weiß nicht wirklich, was ein Gültigkeitsbereich ist. Er wartet darauf, dass ihm jemand eine Komplettlösung macht. Entweder gib sie ihm oder lass es. Aber versuch nicht die pädagogische Tour. Sie funktioniert nicht. Da wurden hier im Forum schon 13 Seiten für verschwendet.

    Das Reicht jetzt !! was bildest du dir eigendlich ein ... er versucht es wenigstens auf die nette tour nicht so wie du unhäfflich und denkst du wärst der beste
    und nein ich habe tausendmal gesagt ich will keine komplette lösung sondern nur wissen wo der fehler liegt ... das kriege ich schon alleine gelöst wenn ich weiß wo der ist !!

    und ich sagte dir auch das du es lassen sollst .. ich dachte du hast die gedult mit mir verloren .. aber genug zeit um mich runter zu machen .... eingebildeter !§%§ !!



  • Cevin19994 schrieb:

    Zu dem gültigkeitsbereich : Ähm ja es kommem mehrere fehlermeldungen das meine md's nicht deklariert sind

    was spricht dann dagegen, die md's zu deklarieren?

    Cevin19994 schrieb:

    wie kann ich denn nicht das zuletzt gemessene sondern alles in die neuen strings und doubles schreiben ?

    gar nicht - Du kannst nicht mehr als einen double in einen double stecken. Strings könntest Du an einander ketten - aber das ist wohl nicht, was Du willst.
    Und wenn Du die Summe willst, geht mit +, sagte ich schon.



  • Hmmm ou ... Ja also in doubles passten nie mehr als ein double ?
    ok Und in Arrays ? da kann ich ja ziemlich viele ints unterbringen bei bedarf ... gilt das auch für doubles ? 🙂


  • Mod

    Cevin19994 schrieb:

    Das Reicht jetzt !! was bildest du dir eigendlich ein ... er versucht es wenigstens auf die nette tour nicht so wie du unhäfflich und denkst du wärst der beste
    und nein ich habe tausendmal gesagt ich will keine komplette lösung sondern nur wissen wo der fehler liegt ... das kriege ich schon alleine gelöst wenn ich weiß wo der ist !!

    und ich sagte dir auch das du es lassen sollst .. ich dachte du hast die gedult mit mir verloren .. aber genug zeit um mich runter zu machen .... eingebildeter !§%§ !!

    DU verschwendest hier seit Wochen die Zeit freiwilliger Helfer mit den immergleichen Fragen, weil du einfach nicht die Tipps befolgst, die dir in dem ersten Thread in den ersten Antworten gegeben wurden und nicht wenigstens mal so viel C++ lernst, dass du die Antworten (die du zu dieser Frage auch schon zig mal bekommen hast) überhaupt verstehst. Du merkst ja nicht einmal, dass du deine Antwort schon mindestens 5x bekommen hast.

    Ich schreite hier als Moderator des Forums ein, nicht um dir zu helfen, sondern um Besserwessi davor zu bewahren, was ich, Werner Salomon, unskilled, out, Michael E. und andere schon längst hinter uns haben: Mit einer Wand reden. Da kann er viel besser jemand anderem helfen, dem das auch was bringt und wo er hinterher das Gefühl hat, auch wirklich geholfen zu haben.



  • Cevin19994 schrieb:

    Hmmm ou ... Ja also in doubles passten nie mehr als ein double ?
    ok Und in Arrays ? da kann ich ja ziemlich viele ints unterbringen bei bedarf ... gilt das auch für doubles ? 🙂

    Klar, wobei Container besser sind. Du hast aber nie gesagt, dass Du Arrays brauchst - wofür? Ich dachte, Du wolltest summieren.



  • Besserwessi schrieb:

    Cevin19994 schrieb:

    Hmmm ou ... Ja also in doubles passten nie mehr als ein double ?
    ok Und in Arrays ? da kann ich ja ziemlich viele ints unterbringen bei bedarf ... gilt das auch für doubles ? 🙂

    Klar, wobei Container besser sind. Du hast aber nie gesagt, dass Du Arrays brauchst - wofür? Ich dachte, Du wolltest summieren.

    nun ja das summieren klappt jetzt ja wunderbar ganz unten im code ... mit dem "+" 😉 nur das er nicht alles zeilen summiert weil ich ja meine neuen doubles summieren will wo nur ein double rein passt ... deswegen dachte ich mir wenn ich
    meine neuen doubles ( die ich zurzeit summiere ) mit arrays oder besser containern .. danke :).. austausche .. könnte ich es richtig summieren ? denk ich da falsch ? oder ... 🙂



  • SeppJ schrieb:

    Cevin19994 schrieb:

    Das Reicht jetzt !! was bildest du dir eigendlich ein ... er versucht es wenigstens auf die nette tour nicht so wie du unhäfflich und denkst du wärst der beste
    und nein ich habe tausendmal gesagt ich will keine komplette lösung sondern nur wissen wo der fehler liegt ... das kriege ich schon alleine gelöst wenn ich weiß wo der ist !!

    und ich sagte dir auch das du es lassen sollst .. ich dachte du hast die gedult mit mir verloren .. aber genug zeit um mich runter zu machen .... eingebildeter !§%§ !!

    DU verschwendest hier seit Wochen die Zeit freiwilliger Helfer mit den immergleichen Fragen, weil du einfach nicht die Tipps befolgst, die dir in dem ersten Thread in den ersten Antworten gegeben wurden und nicht wenigstens mal so viel C++ lernst, dass du die Antworten (die du zu dieser Frage auch schon zig mal bekommen hast) überhaupt verstehst. Du merkst ja nicht einmal, dass du deine Antwort schon mindestens 5x bekommen hast.

    Ich schreite hier als Moderator des Forums ein, nicht um dir zu helfen, sondern um Besserwessi davor zu bewahren, was ich, Werner Salomon, unskilled, out, Michael E. und andere schon längst hinter uns haben: Mit einer Wand reden. Da kann er viel besser jemand anderem helfen, dem das auch was bringt und wo er hinterher das Gefühl hat, auch wirklich geholfen zu haben.

    ach komm niemand mag dich hier .. toller moderator .. ich habe deine letzten antworten gesehen .. du bist nicht nur zu mir so negativ sondern zu allem was dir nicht passt .. und das hörst du wohl nicht zum erstenmal .... und ob du es glaubst oder nicht ... selbst wenn mein problem nicht gelöst ist hat er mir schon geholfen .. ich weiß jetzt warum das mit dem summieren nicht klappt wie es soll .. dafür bin ich auch dankbar ... und ganz ehrlich such dir ne freundin ... irgendwann verlier ich auch meine geduld mit menschen und da bin ich nicht mehr höfflich ... also endschuldige meinen ton diesmal bitte gruß cevin 😉



  • Cevin19994 schrieb:

    ach komm niemand mag dich hier

    Doch ich.


Anmelden zum Antworten