Textdatei analysieren
-
Hallo
Also ich hab nee ziemlich große textdatei (7,8 MB).
Ich hab schon mal rumexperimentiert, aber nichts ist herrausgekommen.
Prozedurablauf:
Eingabe von einem Suchbegriff
Folgendes Problem:
wie finde ich die zeile und gebe sie anschließend aus ohne die vorhergehenden auszugeben.
Danke im vorraus
-
bibstudent258 schrieb:
Hallo
Also ich hab nee ziemlich große textdatei (7,8 MB).
Ich hab schon mal rumexperimentiert, aber nichts ist herrausgekommen.
Prozedurablauf:
Eingabe von einem Suchbegriff
Folgendes Problem:
wie finde ich die zeile und gebe sie anschließend aus ohne die vorhergehenden auszugeben.
Danke im v******freage entzieht sich meinem verständnis. brauchst doch beim suchen nix auszugeben. meintest du einlesen?
volltextsuche? dann mußte eh jede zeile lesen. am besten mit boyer-moore oder abwandlungen. kann dir da was besorgen, wenn du das brauchst.
oder immer "suchbegriff: text" in einer zeile? dann leg nen index an.
-
nee
zum besseren Verständniss ein beispiel
a
b
c
d
..
abd
..
zzzusw.
es kommt die eingabe von abd. Jetzt muss das Prog nach der zeile suchen und sie ausgeben
beispiel:
suchbegriff: abd
gefunden: "zeileninhalt"
-
stl-container haben auch suchfunktionen
-
also alle zeilen liegen sortiert in der datei und du willst feststellen, ob ein eine gegebene zeile in der datei als zeile vorkommt?
zwei wege:
a) du darfst die datei einmal ganz lesen. lies sie und bau nen index auf, der einfach eine liste der positionen der zeilenanfänge ist. speicher den index, der wo nur ein array ist, binär ab.
so, nu haste direktzugriff in jedes indexfeld über fstream/seek und per indirektion auch auf jede zeile der hauptdatei. dann mach bei jeder anfrage ne binäre such in der hauptdatei. den index neu erstellen brauchste nur, wenn sich die hauptdatei geänder hat.b) mach binäre suche in der hauptdatei, aber vor jedem vergleich mußt du um so viele positionen in der datei rückwärts gehen, bis du nen zeilenumbruch findest. ist komplizierter, aber ist auch fein schnell und kommt ohne index aus.
aber du hast noch nicht gesagt, auf was es dir ankommt. ist es ein performance-problem? oder kriegstes nur allgemein nicht hin und würdest gerne 5 sekunden zahlen pro aufruf, wenn der code einfach ist?
-
die 5 sec sind mir egal, ich weiß nur nicht wie ich das insgesamt anstelle.
Könntes du ma n Beispiel geben
-
bibstudent258 schrieb:
die 5 sec sind mir egal, ich weiß nur nicht wie ich das insgesamt anstelle.
Könntes du ma n Beispiel gebenbool hasLine(char const* filename,string const& toFind){ ifstream in(filename); string line; while(in>>line) if(line==toFind) return true; return false; }
-
na gut
, aber dass liefert mir nur den bool wert zurück, Das Programm soll wie eine Suchmaschine funktionieren. Man gibt ein Suchbegriff ein und es zeigt dem Benutzer die zeile wo es überall vorgekommen ist.
-
dann nimm z.b. einen std::vectorstd:string und baller da immer jeweils immer eine zeile rein... dann durchsuchst du die strings einzlen und weisst dann auch in welcher zeile der datei der spass stand.... oder du merkst dir wieviele newlines du bereits passiert hast...
-
void hasLine(char const* filename,string const& toFind){ ifstream in(filename); string line; while(in>>line) if(line.find(toFind,0)!=string::npos) cout<<line<<'\n'; }
-
windalf kannst du mir ma ein code beispiel geben
-
was gefällt dir denn an volkards code nicht?