Inhalte aus .txt Files Filtern und ausgeben



  • Hallo

    als Anfänger in C++ stehe ich im Dunkeln

    hab die spannende Aufgabe aus .txt Files für mich wesentlichen Inhalt raus zu filtern.

    Mein Ziel ist ein Ordner / Verzeichnis in dem sich diverse File.txt befinden nach Textinhalt zu durchsuchen und dann in eine Liste.txt ein zu fügen.

    Mein Ansatz:

    File um File im Verzeichnis zu öffnen und zeilenweise überprüfen des Inhaltes.
    Jedoch möchte ich jeweils nur den Teil der Zeile vom Suchkriterium bis zum nächsten Lehrschlag in meine Liste kopieren.

    Bsp:

    Suchkriterium: Wert_=

    Text

    Dies ist der Wert_=1325 Beispiel Text

    In der Lösungsmenge müsste nun Wert_=1325 stehen.

    Das Öffnen / Einlesen und das Speichern ist mir bekannt.

    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include <fstream>

    using namespace std;

    void main ()
    {
    // Schleife für Verzeichnis??

    string suche;
    ifstream infile("C:\\Verzeichnis\\Test.txt");
    ofstream outfile;
    outfile.open("C:\\Resultate\\Liste.txt");

    while ( std::getline(infile,suche) )
    {
    // Schleife für Filter??
    {
    cout << suche << endl;
    outfile << suche << ";" << endl;
    }
    //

    }
    //
    outfile.close();
    }

    Bei den Schleifen für Verzeichnis und Filter stehe ich an.

    Für klärende Beiträge bin ich sehr dankbar. 😕



  • Du muss dein Inputfile natürlich auch öffnen... Und auch wieder schließen.

    http://www.cplusplus.com/reference/iostream/istream/
    http://www.cplusplus.com/reference/iostream/ostream/

    Oder für in und out:
    http://www.cplusplus.com/reference/iostream/fstream/



  • Es gibt in diesem Forum die Möglichkeit Code mit C/C++ Tags auch ansprechend darzustellen:

    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include <fstream>
    
    using namespace std;
    
    void main ()
    {
    // Schleife für Verzeichnis??
    
    string suche;
    ifstream infile("C:\\Verzeichnis\\Test.txt");
    ofstream outfile;
    outfile.open("C:\\Resultate\\Liste.txt");
    
    while ( std::getline(infile,suche) )
    {
    // Schleife für Filter??
    {
    cout << suche << endl;
    outfile << suche << ";" << endl;
    }
    //
    
    }
    //
    outfile.close();
    }
    

    😉



  • 🙄 🙄



  • Gut dann halt auch noch was zum Thema:
    std::string hat eine find-Funktion mit der man durchsuchen kann.
    Vielleicht hilft dir das weiter : http://www.cplusplus.com/reference/string/string/find/



  • halo schrieb:

    Gut dann halt auch noch was zum Thema:
    std::string hat eine find-Funktion mit der man durchsuchen kann.
    Vielleicht hilft dir das weiter : http://www.cplusplus.com/reference/string/string/find/

    👍 🙂

    Bin jetzt soweit, dass ich aus einem File die dem Suchkriterium entsprechenden Zeilen separieren und ausgeben kann.

    Jetzt müsste ich noch aus allen Files eines Verzeichnisses filtern können. 😕



  • So oder so ähnlich für Windows (Unicode):

    void OrdnerDurchsuchen (const wstring& ordner, bool subfolder = true)
    {
    	wstring suchordner = ordner + L"\\*.*";
    
    	WIN32_FIND_DATA FData;
    
    	HANDLE hSearch = FindFirstFile(suchordner.c_str(),&FData); 
    	BOOL MoreFiles = FALSE; 
    
    	if (hSearch == INVALID_HANDLE_VALUE) return;
    
    	do
    	{
    		// Ist das ein Ordner ? 
    		if (FData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) 
    		{
    			if(static_cast<wstring>(FData.cFileName) != L"." && static_cast<wstring>(FData.cFileName) != L"..")
    			{
    				wstring unterordner = ordner + L"\\\\" + static_cast<wstring>(FData.cFileName);
                    if(subfolder == true)
    				    FindData(unterordner); //REKURSION findet hier statt, Unterordner werden auch durchsucht
    			}
    		}
    		else
    		{
    			wstring datei = ordner + L"\\\\" + static_cast<wstring>(FData.cFileName);
    
    		}
    		MoreFiles = FindNextFile(hSearch,&FData); 
    	} while (MoreFiles); 
    
    	FindClose(hSearch);
    }
    


  • Hier noch einmal der Code von HighLigerBiMBam, nur halt in schönem C++, was Knappheit, Portabilität und Eleganz mit einschliesst:

    void search_folder(const std::wstring& folder)
    {
      typedef boost::filesystem::wrecursive_directory_iterator directory_iterator;
      for (directory_iterator di(folder),end; di!=end; ++di) {
        if (boost::filesystem::is_regular_file(di->status())) {
          std::wcout << di->path().filename() << std::endl;
          // ... hier Datei öffnen und untersuchen
        }
      }
    }
    

    Falls du auf Unicode und Rekursion verzichten willst, kannst du diese leicht modifizierte Fassung verwenden:

    void search_folder(const char *folder)
    {
      typedef boost::filesystem::directory_iterator directory_iterator;
      for (directory_iterator di(folder),end; di!=end; ++di) {
        if (boost::filesystem::is_regular_file(di->status())) {
          std::cout << di->path().filename() << std::endl;
          // ... hier Datei öffnen und untersuchen
        }
      }
    }
    

    Nachteil ist die Verwendung von Boost.Filesystem, aber genau diese Bibliothek wird in C++0x (und sogar schon tr2) enthalten sein.

    BTW@HLBB: warum wird in OrdnerDurchsuchen() die FindData() aufgerufen und auf Rekursion verwiesen? Und was ist der Sinn davon, bei

    if(static_cast<wstring>(FData.cFileName) != L"." && static_cast<wstring>(FData.cFileName) != L"..")
    

    zu casten, noch dazu statisch, und mit einem nicht notwendigerweise Unicode-C-String zu vergleichen? Irgendwie habe ich das Gefühl, dass Windows deine wstring-Konsequenz nicht unterstützt, darum würde ich sie bleiben lassen. Übrigens ist es nicht unbedingt sinnvoll, immer auf std::wstring s zu beharren und C-Strings aus dem Weg zu gehen.
    Desweiteren sehe ich Vergleiche wie

    if(subfolder == true)
    

    als typische Anzeichen eines Anfängers an.
    Und schlussendlich hätte ich bei

    if (hSearch == INVALID_HANDLE_VALUE) return;
    

    - wie es übrigens bei mir von Boost.Filesystem intern gemacht wird - eine Ausnahme geworfen.



  • Das mit FileData sollte eigendlich OrdnerDurchsuchen sein... Das mit dem static cast gefällt mir auch nicht btw. Hatte wenig lust mir darüber Gedanken zu machen. Nicht jeder darf sich den Luxus leisten boost zu verwenden. Und den Rest kann er anpassen wie er möchte. Ging mir nur ums Prinzip.


Anmelden zum Antworten