In Dateien an bestimmten Positionen nach gegebenen Text suchen



  • Hi,

    Ich wollt mal rumfragen, ob sich schon jemand damit auseinander gesetzt hat.
    Mein Problem:

    Ich habe eine etwa 2-3 MB große Textdatei (gut 9000 Zeilen, Pro Zeile jeweils etwa 30 Semicolons ( ; ) als Trennzeichen zwischen den jeweiligen Daten.
    In der Datei muss ich prüfen, ob ein (vorher eingegebener) String vorhanden ist oder nicht (und wenn er vorhanden ist, dann wie oft und in welchen Zeilen).

    Was ich im enteffekt tun muss:
    Den gesamten Text Zeilenweise einlesen und zwischen 2 festgelegten Semicolons (deren Positionen in jeder Zeile anders sein können) den dortigen String herausnehmen und einzeln mit dem Suchtext vergleichen.
    Wenn der String gleich dem Suchtext ist, so soll die Zeile gesondert weggesichert werden (in eine andere Variable rein) und zudem die Zeilennummer gesichert werden.
    Danach soll natürlich weiter gesucht werden bis das Dateiende erreicht ist.

    Wo es hakt:
    Mit den bisherigen Routinen liest das Programm zwar den kompletten Text ein (sichert diesen nebenbei in ein entsprechend großes Array), sucht aber immer nur zwischen den Semicolonpositionen, die er aus der ersten Zeile einließt (obwohl vor jedem Zeilendurchlauf die Variablen für die Positionen geleert und dann aus der aktuellen Zeile wieder neu gelesen werden 😕 ).

    Ich werde nochmal die Routine raussuchen, wäre aber gut, wenn mir jemand da schon jetzt helfen könnte.

    Genutztes Programm:
    Borland C++ Builder 4 Pro bzw. Borland C++ Builder 6 (technisch kommt das selbe bei raus).



  • Wenn ich das richtig verstehe, kommt das Suchwort maximal einmal pro Zeile vor? Wenn ja:
    TStringList verwenden. Text in StringList laden und durch die einzelnen Zeilen iterieren und mit AnsiPos nach dem Suchbegriff suchen.



  • Ja, hast richtig verstanden.
    Ich schau mal, ob es so lösbar ist, wie du es angegeben hast.

    Was ich aber noch anhängen muss:
    Der Suchbegriff kann zwar normal nur ein mal pro Zeile vorkommen, jedoch kann dieser auch wieder an verschiedenen Stellen (zwischen 2 anderen Semicolon Stellen) stehen.
    Wichtig ist, dass zwischen 2 bestimmten Semicolons gesucht wird.

    Das was du als Lösungsweg genannt hast, dürfte dazu führen, dass das Programm einfach nur die Zeilen durchsucht, was aber so nicht gedacht ist.

    Beispielzeile:

    Daten1;Daten2;Daten3;Daten4;Daten5;Daten6;Daten7;Daten8;Daten9;Daten10;Daten11;Daten12;Daten13;Daten14;Daten15;Daten16;Daten17;.....

    (Als Beispiel wird das dick gedruckte gesucht, hier Daten13, also zwischen den Semicolons 12 und 13)

    EDIT:
    PS: das mit dem iterieren hab ich nicht ganz verstanden



  • z.B. so

    TStringList* slTest = new TStringList();
    AnsiString asSuchbegriff = "Daten13";
    AnsiString asCurLine;
    int iCount = 0;
    int iSemikolon = 12;
    int iPos;
    
    // Daten laden
    slTest->LoadFromFile("c:\\test.txt");
    // zeilenweise abarbeiten
    for (int i = 0; i < slTest->Count; i++)
    {
    	asCurLine = slTest->Strings[i];
    	// 12 Semikolons übespringen
    	for (int x = 0; x < iSemikolon; x++)
    	{
    		if (!asCurLine.IsEmpty())
    		{
    			iPos = asCurLine.AnsiPos(";");
    			if (iPos)
    				asCurLine.Delete(1, iPos);
    		}
    	}
    	// Suchbegriff muss jetzt an erster Stelle in asCurLine stehen
    	if (asCurLine.AnsiPos(asSuchbegriff) == 1)
    	{
    		// irgendwohin speichern
    		// xxxx = slTest->Strings[i];
    		iCount++;
    	}
    }
    delete slTest;
    

    Ob das so, bei +9000 Zeilen schnell genug ist, sei mal dahingestellt. Aber ich will Dir ja auch nicht den gesamten Spass nehmen. 😉


Log in to reply