String-Suche und Ersetzen in einer Datei - Anfänger



  • Danke! Ich werde mir die ganzen Klassen heute Abend ansehen.
    Die Suchen und Ersetzen Sache habe ich gestern mit der Replace Klasse hinbekommen.

    3. Muss ich den Inhalt der Datei immer in einen String schreiben oder gibt es eine direkte Methode?

    4. Mit welcher Klasse kann ich nach einer Häufigkeit eines Strings in einer Datei suchen und die Häufigkeit dann anzeigen lassen?

    Danke für alle Antworten,

    And3



  • So, habe mich jetzt der Klasse StdioFile bedient und habe folgenden Code zum laufen gebracht:

    if(DateiLaden.Open(m_pathname, CFile::modeRead))
        {
    		while(DateiLaden.ReadString(strTemp))
    		{
    			// Datei zeilenweise auslesen:
    			m_strdatei += strTemp;
    		}
    		DateiLaden.Close ();
    		SetDlgItemText(IDC_EDIT2, m_strdatei);
        }
        else
    	{  
    		m_strdatei = "Fehler beim Öffnen der Datei!";
    		SetDlgItemText(IDC_EDIT2, m_strdatei);
    	}
    

    - Ich habe aber noch das Problem, dass ich keinen Zeilenumbruch hinbekomme. Da ich aber zeilenweise auslese müsste das doch kein Problem sein, oder? Gibt es da Möglichkeiten mit \r und \n oder wie mache ich das am Besten??

    - Mein else Aufruf ist wahrscheinlich etwas kompliziert und nicht emprfehlenswert. Gibt es eine bessere Alternative?

    - Bitte antwortet auch auf meine 4. Frage ein Beitrag drüber, da ich da nicht mehr weitergekommen bin.

    Vielen Dank für die Antworten und die Hilfe,

    And3



  • Moin!

    Zu 4: Mach ne Kopie vom CString und ruf dann Replace auf. 😃

    Und den Zeilenumbruch macht das ReadString automatisch weg. Ändere die Zeile einfach auf

    m_strdatei += strTemp + _T("\n");
    

    🙂



  • Danke! Jetzt funktioniert der Zeilenumbruch wie in der Datei. Ich muss aber noch \r dazuschreiben:

    m_strdatei += strTemp + _T("\r\n");
    

    Es ist jetzt nur so, dass das Textfeld teilweise zu schmal ist und der Text einfach rechts verschwindet. Gibt es eine Möglichkeit den Text nochmal anhand der Größe des Textfeldes zu brechen?

    zu 4 nochmal eine Frage:
    @estartu: Wie war das genau gemeint mit: Kopie vom CString und dann Replace aufrufen?
    Soll ich den String, in dem der Inhalt der Datei steht, kopieren und dann Replace ausführen? Wie komme ich aber dann auf die Vorkomnisse?

    Vielen Dank,

    And3



  • And3 schrieb:

    Gibt es eine Möglichkeit den Text nochmal anhand der Größe des Textfeldes zu brechen?

    Ja, schau dir die Eigenschaften mal genauer an. 🙂

    Soll ich den String, in dem der Inhalt der Datei steht, kopieren und dann Replace ausführen?

    Genau.

    Wie komme ich aber dann auf die Vorkomnisse?

    Lies mal die Doku zu Replace. 😃

    MSDN schrieb:

    Return Value
    The number of replaced instances of the character. Zero if the string isn't changed.



  • @estartu: Vielen Dank!

    Ja, schau dir die Eigenschaften mal genauer an.

    Habe mir die Eigenschaften nochmals genau durchgesehen (die des Textfeldes), jedoch habe ich keine weiteren Eigenschaften zu Zeilenumbruch nach Textfeld gefunden.
    Diese hatte ich schon aktiviert:
    - Mehrfachzeile.
    (Ich benutzte Visual Studio 2005).
    Zusätzliche habe ich noch vertikalen Bildlauf aktiviert und ein paar andere Dinge, die aber dies nicht beeinträchtigen dürften.
    Gibt es eine weitere Eigenschaft, die es mir nicht anzeigt??

    Lies mal die Doku zu Replace.

    Welche Doku meinst du? Die von msdn? Da habe ich nach der klasse replace gesucht, aber nicht das gefunden, was du geposted hast.

    MSDN schrieb:
    Return Value
    The number of replaced instances of the character. Zero if the string isn't changed.

    Vielen Dank! Damit wurde mir wirklich geholfen! Jetzt kann ich die Anzahl hiermit auslesen (vorkmnisse ist int):

    vorkomnisse = strTemp.Replace(m_strsuchen,_T("(x)"));
    

    Ich möchte die Anzahl jetzt ausgeben und habe es hiermt gemacht:

    SetDlgItemText(IDC_STATIC, m_strsuchen + _T(" wurde ") + [i](vorkomnisse)[/i] + _T(" mal gefunden."));
    

    Jedoch weiß ich nicht wie ich das int einbringen kann, dass es auch geht. Muss ich dazu den int zu einem String konvertieren??

    Danke,

    And3



  • Habe jetzt nach langer Arbeit herausbekommen, wie ich die Anzahl ausgeben kann und habe auch den Zeilenumbruch hinbekommen (lag an aktiviertem "automatischen HSCROLL").
    Danke für alle bisherigen Antowrten, besonderen Dank an estartu!

    Ich habe somit nur noch eine große Hürde, bei der ich um Hilfe bitte:
    Meine Vorkomnisssuche sieht z.Zt so aus:

    int vorkomnisse = strTemp.Replace(m_strsuchen,_T("(x)"));
    

    Wie kann ich jetzt Groß/Kleinschreibung unsabhängig suchen?? Bisher werden bei Suche z.B: von "der", nur die Kleinen und bei "Der" nur die Großen gefunden. Ich habe bisher noch keine Erweiterungen (oder wie das heißt) gefunden, die Groß/kleinschreibung deaktivieren.

    And3



  • Ganz einfach, wandle alles vor dem Suchen in Groß- oder Kleinbuchstaben (ToLower() bzw. ToUpper()) und passe deinen Suchstring entsprechend an, und führe dann deinen Replace() aus.

    Gruß Matthias



  • Danke für die Antwort, würde funktionieren wenn ich nur suchen wollte, aber es könnte auch sein, dass ich danach noch ersetzen will und dann habe ich ein Problem, da die Datei dann unbrauchbar ist, wenn alles klein bzw. groß ist. Das hatte ich nicht erwähnt, sorry.

    Gibt es keine andere Möglichkeit für die Groß/Kleinschreibung?

    Danke,

    And3



  • Erstens ersetzt Replace() so und so, und zweitens gibt es natürlich auch noch eine andere Möglichkeit. Würdest Du sicherlich auch drauf kommen, erstell doch von deinem Suchstring alle Möglichen Varianten in Groß- und Kleinschreibung, desweiteren is die Variante so und so nur zum Zählen der Vorkommnisse. Wenn Du ohne beachtung der Schreibweise was machen willst, wirst Du dich selbst hinsetzten müssen und was schreiben müssen. Außer es hat noch jemand hier ne Blitzidee.

    Gruß Matthias



  • Hi.
    Du hättest da folgende Möglichkeit:

    //m_strInput       -> eingelesener String, der bearbeitet werden soll
    //m_strOutput      -> bearbeiteter String, der ausgegeben werden soll
    //strSearchString  -> String, nach dem gesucht werden soll
    //strReplaceString -> String, durch den ersetzt werden soll
    //die letzen beiden Strings können z.B. vom User abgefragt werden
    
    m_strOutput = m_strInput;
    CString strTemp(m_strInput);//temporäre Kopie des Strings erstellen
    
    if(m_bCaseSensitive) //Falls auf Groß-/Kleinschreibung geachtet werden soll
    {
        //für die Suche alle Buchstaben in Kleinbuchstaben umwandeln
        strTemp.MakeLower();
        strSearchString.MakeLower();
    }
    
    //Anzahl an zu ersetzenden Wörtern ermitteln
    int iStringsFound = strTemp.Replace(strSearchString,strSearchString);
    
    if(iStringsFound)//Wenn Übereinstimmungen gefunden
    {
        int i=0,
            iSearchStringLen = strSearchString.GetLength(),
            iReplaceStringLen = strReplaceString.GetLength(),
            iPosition=0;
    
        while(i<iStringsFound)
        {
            //Positionen der gefunden Substrings ermitteln
            if(!i)
                iPosition = strTemp.Find(strSearchString,0);
            else
                iPosition = strTemp.Find(strSearchString,iPosition+iSearchStringLen);
    
            //gewünschten String ersetzen...
            //(1. Parameter -> Substring aus Originalstring mit Groß- und Kleinbuchstaben)
            //(2. Parameter -> String, durch den ersetzt werden soll)
            m_strOutput.Replace(m_strOutput.Mid(iPosition+(i*(iReplaceStringLen-iSearchStringLen)),iSearchStringLen), strReplaceString);
            i++;
        }
    }
    

    Wenn du dabei die Variable "bCaseSensitive" auf true setzt, wird zusätzlich bei der Suche auf die Groß- und Kleinschreibung geachtet.

    MfG


Anmelden zum Antworten