Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Textdatei nach doppelten Einträgen durchsuchen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.10.2009, 08:40 Uhr
~Testuser
Gast


Morgen zusammen,

Ich soll ein c++ Programm schreiben welches eine Textdatei einlist und diese nach doppelten Einträgen druchsucht. Die Textdatei ist folgendermaßen aufgebaut

300|001|001|000000147501||admin|20090504173105|admin|20090504173105|
300|001|002|000000147502||admin|20090504173105|admin|20090504173105|
300|001|003|000000019733||admin|20090504173105|admin|20090504173105|

... ca. 60k dieser Zeilen sinds.

Nun soll die 4. Spalte nach doppelten werten durchsucht werden.

mein bisheriger code:


C++:
#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
        ifstream infile("C:\\Dokumente und Einstellungen\\owalter\\Desktop\\textsuche.txt");


     if( infile.is_open())
    {
         cout <<""Datei erfolgreich eingelesen""<<endl;
    string strLine;
    while(getline(infile, strLine) )
    {
        
        if(strLine.substr(12,24).compare("000000147501")==0)
                {       cout << "gefunden" << endl;
            }
        else
        {
            cout << "nicht gefunden" <<endl;
        }
    }
    infile.close();

        }

   cout <<"fertig"<<endl;
  
    system("PAUSE");
    return EXIT_SUCCESS;
}



Habe veruscht vorerst mal nur nach einem Wert zu durchsuchen, aber selbst hier scheiterts... Die Datei wird eingelesen aber beim Vergleichen findet er nix... nicht mal den angegebenen Wert der auf jedenfall enthalten ist in der Datei.

Schon mal Danke für die Hilfe

Dieser Post wurde am 15.10.2009 um 14:47 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.10.2009, 10:11 Uhr
ao

(Operator)



Zitat:
if(strLine.substr(12,24).compare("000000147501")==0)

Du vergleichst einen 24 Zeichen langen Substring mit einem 12 Zeichen langen Literal? Das ist doch niemals gleich.

Kleiner Tipp: Solche verketteten Ausdrücke mit temporären Objekten wie da oben sind problematisch. Du hast keine Möglichkeit, festzustellen, ob der von substr gelieferte string das enthält, was du erwartest.

Besser: Zwischenergebnisse festhalten. Die kann man auf Plausibilität prüfen, bevor es weitergeht, und man kann sie auch leicht mal zur Kontrolle cout'en.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.10.2009, 12:02 Uhr
~Testuser
Gast


Bin nun schon um einiges weiter...


C++:
#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
        ifstream infile ("Textsuche.txt");

     string getline_inhalt;
     int zaehler = 0;

     if( infile.is_open())
    {
     cout <<"Datei erfolgreich eingelesen"<<endl;

    while(getline(infile, getline_inhalt) )
    {
        zaehler = 0;
        int Zeile = 0;
        string value = getline_inhalt.substr(12,12);
                         Hier muss eine schleife her, in der getline_inhalt.substr(12,12) eine Zeile weiterspringt und value muss gleich bleiben
        {
            //cout << value <<endl;
            //cout <<getline_inhalt.substr(12,12)<<endl;
        if(value == getline_inhalt.substr(12,12))
              {
                    zaehler++;
            }
        if (zaehler >= 2)
        {
            cout <<"Der Wert "<<getline_inhalt.substr(12,12)<< " ist doppelt! "<<endl;
        }
        //cout << zaehler << endl;
        }
    }
    infile.close();

        }

   cout <<"fertig"<<endl;


    return 0;
}



An der oben Fett markierten Stelle muss eine schleife her, in der getline_inhalt.substr(12,12) eine Zeile weiterspringt aber value muss gleich bleiben, damit wäre mein problem gelöst... habt ihr eine idee?


Bearbeitung:

codetags verwenden!!!


Dieser Post wurde am 15.10.2009 um 14:42 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.10.2009, 15:40 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Eventuell hilft dir auch das hier...

www.fun-soft.de/showtopic.php?threadid=20751&time=1254401870

Vom Prinzip her musst du dich nach dem Einlesen dann nur noch auf das konzentrieren ,was du wirklich machen willst...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.10.2009, 00:53 Uhr
~global
Gast


leg ne map an die deinen "value" als key hat, bei jeder neuen zeile testest du ob der wert schon in der map ist, wenn nicht füg ihn in die map ein, wenn ja verwerf die zeile und spring zur nächsten.

bei 60k datensätzen ist das aber eigentlich ne aufgabe für ne datenbank.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.10.2009, 08:25 Uhr
0xdeadbeef
Gott
(Operator)


Datenbank wär ne Überlegung wert, aber 60k Datensätze lassen sich auch so noch bewältigen. Ich stell mir das etwa so vor: Du hältst einen Baum bereits ausgezählter Elemente vor, beispielsweise ein std::set<unsigned long>. Dann liest du die Datei zeilenweise ein, kuckst im Baum nach, ob das Feld schon mal den selben Wert gehabt hat, und wenn ja, speicherst den entsprechenden Wert der neuen Zeile und schreibst die neue Zeile in die Ausgabedatei.

Das ganze skaliert mit O(n * log(n)), also wird es für noch größere Datenmengen irgendwann unhandlich, aber 60k sollte noch in endlicher Zeit lösbar sein.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: