C programm, große .txt Datei durchsuchen, mit Prozent Fortschrittsanzeige
-
Das Blockweise lesen klingt interessant. Aber habe ich da wirklich auch eine schnellere Suche? Denn ich muss ja trotzdem immer den gesamten Block durchsuchen. Wenn nichts gefunden wurde wird der Nachfolgende Block durchsucht. Als Leihe würde ich vermuten dass dies gleichschnell ist als alle Zeilen einzulesen. Ich bin keine Informatikerin, daher kann ich auch falsch liegen.
@SeppJ sagte in C programm, große .txt Datei durchsuchen, mit Prozent Fortschrittsanzeige:
Was willst du am Ende haben?
Am Ende möchte ich einen Eindeutigen Ticker haben mit dem ich einen bestimmten Datensatz zuordnen kann. Ich Suche z.b "great falls". In der 80 GB Datei gibt es mehrere Datensätze die "great falls" beinhalten. Ich als Mensch kann die gefundenen Einträge zu "great falls" richtig interpretieren. Während der Suche merke ich z.b dass "great falls tt" der richtige Datensatz ist. Der Ticker dazu ist z.b. 10584. Ich speichere die gefundene Zeile in der Variable Position, setze den File pointer f auf den Anfang der Datei, springe mit SEEK_CUR zu der gefundenen Zeile und printe die Daten in eine .csv Datei (also die den Ticker 10584 haben). Dann habe ich in der .csv Datei alle Daten mit dem Ticker 10584. Ist etwas kompliziert aber ich habe keine bessere Möglichkeit gefunden. Das ist eben nur ein Teil vom Code.
-
Was genau meinst du mit dem Ticker? Das
position = ftello64(f);
aus deinem Post ganz oben?Wenn das um einen echten, produktiven Einsatzzweck statt den Lerneffekt geht: Ich habe den Eindruck, du programmierst
grep
nach. Du wirst alleine niemals ein Programm schreiben, das besser alsgrep
dein Problem löst.
-
@SeppJ sagte in C programm, große .txt Datei durchsuchen, mit Prozent Fortschrittsanzeige:
Was genau meinst du mit dem Ticker?
Ticker im Sinne von Tickersymbol, d.h. eindeutige ID?
-
@wob sagte in C programm, große .txt Datei durchsuchen, mit Prozent Fortschrittsanzeige:
@SeppJ sagte in C programm, große .txt Datei durchsuchen, mit Prozent Fortschrittsanzeige:
Was genau meinst du mit dem Ticker?
Ticker im Sinne von Tickersymbol, d.h. eindeutige ID?
Ja genau
-
@wob Ich kenne grep nicht und weiß auch nicht was das macht. Ich muss mir das mal anschauen. Ticker: Damit kann ich einen Datensatz zuordnen, dieser ist eindeutig.
Als Beispiel der Datensatz great falls tt hat den Ticker: 10584. Dieser Datensatz enthält 1500 Zeilen. Der Datensatz "great falls rr" mit dem Ticker 19510 interessiert mich nicht und diesen brauche ich nicht. Ich gebe also im Programm "great falls" ein und nach einiger Zeit erhalte ich folgende Ausgabe:great falls rr|Ticker15850 -> Enthält 2501 Zeilen an Daten
great falls ee|Ticker19510 -> Enthält 8500 Zeilen an Daten
great falls tt|Ticker10584 -> Enthält 1500 Zeilen an Daten
great falls uu|Ticker28545 -> Enthält 350 Zeilen an Datenposition = ftello64(f) hier speichere ich die Position des File pointers ab. Wenn ich z.b diese 4 Suchergebnisse habe, weiß ich nun dass ich nur das Ergebnis vom Ticker 10584 benötige. Ich breche dann die Suche ab. Um nun diese Daten zu exportieren, müsste ich den File Pointer wieder an den Anfang der Datei setzen, um genau nach diesen Ticker zu suchen. Damit ich das nicht machen muss, springe ich an diese Gespeicherte position = ftello64(f). Das ist genau die Zeile in der der Ticker 10584 beginnt. Dann kann ich sofort diese Daten exportieren. Das funktioniert auch super.
-
@wob sagte in C programm, große .txt Datei durchsuchen, mit Prozent Fortschrittsanzeige:
Wer ist "er"? OP heißt @jasmin89, da würde ich per Default "sie" annehmen.
Sorry, hatte nicht auf den Namen geachtet.
-
@DirkB sagte in C programm, große .txt Datei durchsuchen, mit Prozent Fortschrittsanzeige:
@hustbaer sagte in C programm, große .txt Datei durchsuchen, mit Prozent Fortschrittsanzeige:
@DirkB Nachdem er mit
float
rechnet, wird sich der Wert ziemlich oft ändernEins nach dem Anderen.
Vielleicht reichen ja auch 5 Nachkommastellen bei Prozentangaben aus.
Und float bringt auch eher Nachteile gegenüber double, da ja noch Konvertierungen dazwischen erfolgen
Ja, klar. Dazu sind dann aber mehr Änderungen nötig als nur "Ausgabe nur, wenn sich der Wert geändert hat". Man muss erstmal vorher gröber quantisieren, dann vergleichen und dann ggf. ausgeben.
-
Das mit der Indexdatei war ein guter Tipp. Ich habe so eine Datei erstellt und nun ist er mir möglich diese 80GB große Datei sofort zu dursuchen. Also das Suchergebnis erhalte ich nun in weniger als 1er Sekunde. Anstatt vorher Minuten.
Ich habe noch eine Letzte Anschlussfrage was nichts mit meiner Frage zu tun hat.
Ich wollte nur Fragen, ob die Windows Suche (die in der Taskbar ist) auch so eine Art Index Suche ist. Wenn ich das laut Microsoft Search indexing richtig verstanden habe, wird für jede Neue Datei (die ich Anlege) eine Indexdatei erstellt, was die wichtigsten Daten abgespeichert. Wenn ich dann etwas mit der Windows Suche finden möchte dann wird diese Index Datei durchsucht.Falls ich das richtig verstanden habe, wo finde ich diese Index Datei. Ist das so eine Art Datenbank?
-
Diese liegt unter
%ProgramData%\Microsoft\Search\Data\Applications\Windows
und heißt (bis einschließlich Windows 10)Windows.edb
(und verwendet folgendes Format: Extensible Storage Engine (ESE) Database File (EDB) format specification).
Für Windows 11 heißt dieseWindows.db
und ist eine SQLite-Datenbankdatei, s.a. Windows.edb wird zu Windows.db – Windows 11 Suchindex wird in SQLite gespeichert.
-
Wenn wir schon beim Thema Datenbanken sind:
Lässt sich die ganze Datei nicht in einer Datenbank überführen? Das würde das Ganze doch wesentlich vereinfachen, vorausgesetzt die Datei wird nicht ständig aktualisiert.
-
@Th69: Danke für die Infos.
@DocShoe: Falls du meine .txt Datei meinst: Würde sicherlich gehen, aber ich kenne mich mit Datenbanken gar nicht aus. Für meine Bedürfnisse ist es ausreichend so wie es aktuell ist.