Summieren und sortieren



  • Also total zusammenkopiert und du verstehst selbst nicht wie Dies und Jenes funtioniert. Somit hilft es dir eigentlich nur, wenn jemand die Lösung postet und du es auch einfach rauskopieren kannst. Tut mir leid, sowas kann ich nicht unterstützen. Ich rate dir, wenn dir was daran liegt, dann setz' dich hin und lerne sauber C++. Wir sind dann auch bereit, dich dabei zu unterstützen. Aber einen C&P Programmierer, der vermutlich jemandem einfach was beweisen will, helfe ich ungern. Sorry.

    Edit: Übrigends ist CSV auch nur eine einfach Textdatei.



  • Ich lerne ja nur kann ich es ja auch nur nach und nach
    ich persöhnlich kenn mich mit streamen aus mit der case funktion mit cout und cin und ein bisschen jetzt mit schleifen ... hab noch einige probleme mit dem syntax 😛
    ich will niemanden was beweisen und will diesmal auch keine komplete lösung als code ... sondern das ich ein tipp bekomme wie ich das anstellen kann mit mein code .. dann lerne ich es selbst 🙂



  • Ich kann dir nicht "summieren und sortieren" erklären, wenn du das dort oben nicht von A-Z selbst geschrieben hast und verstehst. So ist das nun mal. Das geht nicht so einfach. Vielleicht hast du ne falsche Vorstellung von Programmieren, oder ich bin einfach zu Faul dir soviel erklären zu wollen 🙂 Vielleicht findet sich ja jemand motivierteres.


  • Mod

    Deja vu? Meinst du dieses Mal verläuft der Thread anders als die letzten beiden Male, obwohl du mit der gleichen Einstellung ankommst? KasF bringt es schon gut auf den Punkt. Lies auch mal:
    http://www.tty1.net/smart-questions_de.html
    (wird in einem der "Wichtigen" Threads verlinkt, die du sicher nicht gelesen hast)

    Wenn du einfach nur eine Komplettlösung möchtest, 100 € auf den Tisch und es wird dir in einem Tag jemand machen. Dann sparst du dir diese ganzen sinnlosen Threads.



  • 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.


Anmelden zum Antworten