Textdatei Einlesen und Formatieren!



  • Hallo Leute!

    Erstmal möcht ich es zugeben! Ja ich bin ein C++ n99b ;)!

    So und nun zu meinem "Problem".

    1. Ich habe eine Exel tabelle ( da ich diese nicht lesen kann über C++ ohne den VC++ Compiler { oder doch ? } ) in eine *.TXT umgewandelt mit Tabs.
    2. Ich will diese Datei in C++ Einlesen gut soweit bin ich schon mit ifstream und ofstram
    3. In der txt datei steht z.B.
    ----------------------------------------------------------------------

    482 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"

    281 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; I Wish This Were Firefox.; .NET CLR 1.1.4322)"

    195 "Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; nl-NL; rv:1.7.7) Gecko/20050414 Firefox/1.0.3"

    ----------------------------------------------------------------------

    das sind Browser Daten von einer Auswertung ;)! Die Zahlen sind die Variablen für eine Person. Nun un ich will jetzt das, das Programm diese ganzen Zeilen durchgeht und sieht: AHA! Nr. 195 benutzt Firefox 1.0.3 für Macintosh. So nun soll das Programm dann den langen code:

    195 "Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; nl-NL; rv:1.7.7) Gecko/20050414 Firefox/1.0.3"

    in

    Firefox 1.0.3 MacOSX

    umwandeln und das auch bei Windows usw. - evlt wär ne sotier funktion ganz cool :D!

    Aber wär nur nen kleiner spaß am rande!

    Hoffe das war deutlich wenn nicht muss ichs nochmal versuchen! Hoffe um Hilfe 😞 und kleine erklärungen fürfunktionen. :|

    gruß DogEye



  • hmm, das würde nur gehen, wenn du überall eindeutige Trennzeichen hast



  • als trennzeichen dienen die ";"

    Sollte eig. genügen das er erkennt Bis zu dem und dem " ; " is es ein Block usw.

    Es ist ja eine umgewandelte xls tabelle.



  • Hm, dann wäre der erste Block also:

    195 "Mozilla/5.0 (Macintosh
    

    😕 😕



  • Also einfach den richtigen Eintrag zu einem User auszulesen ist kein Problem 😉 Das Problem dürfte viel eher sein, aus dem ganzen Rattenschwanz "Mozilla/5.0 (Macintosh; U; PPC ..." eine Kurzbezeichnung des jeweiligen Browsers zu extrahieren - und da gibt es afaik kein "Standard"format, das universell angewendet wird (sprich: Jedes System hat seine eigene Methode, diesen String zusammenzubasteln)



  • LordJaxom schrieb:

    Hm, dann wäre der erste Block also:

    195 "Mozilla/5.0 (Macintosh
    

    😕 😕

    stümmt da fehlts am anfang ... möp

    naja das ja kein prob .. aber kann c++ nicht eine Zeile durchlesen auf ein Textelement und dann durch eine Ifclausel eine funktion aufrufen oda so!?

    irgendwie muss das doch gehen! :|



  • Klar kannst du das:

    string browser_id="...";
    if(browser_id.find("Firefox")!=string::npos)
      cout<<"Hier haben wir einen (möglicherweise) Firefox";
    //...
    

    Problem ist wie gesagt - du benötigst eine klare Definition, was von den Informationen relevant ist und wie sich welcher Browser melden könnte (bzw wonach du suchen mußt, um einen Browser zu identifizieren).



  • Hm, das lässt sich sicherlich einrichten ^^ denk ich mal.

    und wie mach ich das dann nun, dass es "gekürzt" in eine neue datei geschrieben wird? ich hab bisher zum einlesen:

    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        char fileName[80];
        char buffer[255];
    
        cout << "Dateiname: "; // Eingabe Welche Datei gelesen werden soll
        cin >> fileName;       // Variable für den Dateiname
    
        ifstream fin(fileName);
        cout << "\n";
        char ch;
        while (fin.get(ch))
    
        cout << ch;
    
        cout << "\n\n*** Ende des Inhaltes.***\n";
    
        fin.close();
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • in etwa so:

    ifstream fin("eingabe.txt");
    ofstream fout("ausgabe.txt");
    string zeile;
    while(getline(fin,zeile))//zeilenweise einlesen
    {
      verarbeite(zeile);//hier kannst du dich austoben ;)
      fout<<zeile<<endl;
    }
    

    (ofstreams dienen zur Ausgabe in eine Datei - und können genauso einfach verwendet werden wie cout)



  • hmhm jo gut ich werd ma bissl rumbasteln wenn ichs net pack musst mir weiter helfen :D!



  • Hm irgendwie will des net hab zwar die ausgabe.txt aber nicht wirklich was drin xD

    Hm, wärs umständlich wenn du evlt. nen kleinens beispiel mit ner IF abfrage und fürs ausgeben machst 😕 😞



  • OK, nur ein Fragment - deine Eingaben richtig parsen mußt du schon selber:

    ifstream fin("eingabe.txt");
    ofstream fout("ausgabe.txt");
    string zeile;
    while(getline(fin,zeile))//zeilenweise einlesen
    {
      int sp_pos=zeile.find(' ');
      string nummer=zeile.substr(0,sp_pos);//erster Abschnitt, z.B. "195"
      zeile.erase(0,sp_pos+1);             //Restzeile, z.B. "Mozilla/5.0 (Macintosh; U; PPC ..."
      if(zeile.find("Firefox")!=string::npos)
        zeile="Firefox";
      else if(zeile.find("MSIE")!=string::npos)
        zeile="Internet Explorer";
      else if(...)
        ...
      else
        zeile="unbekannt";
    
      fout<<nummer<<' '<<zeile<<endl;
    }
    


  • ...bin zu ploed irgendwas peil ich da net 😕 ... will dich aber auch net nerven ... hm 😕 ich prob noch bissl



  • Hi, ich nochmal sry fün doppelpost ;)!

    Hab immer noch net geblickt wiesos net funzt :/!

    Wenn mir jemand schreiben könnte wo ich was ersetzen muss an dem code (evlt. hab ich ja was vergessen oO) wär cool 🤡



  • Wenn du dazuschreibst, was du schon hast und was für einen Fehler du bekommst, hilft das sicher weiter - ich bin nicht besonders gut darin, das zu erraten 😉

    Aber ich würde mal vermuten, anstelle der "if()...else if()..." Kaskade in dem oberen Fragment benötigst du deine eigenen Auswertungs-Anweisungen zum Überprüfen des Eingabestrings (dort steht nach dem erase() der Zeileninhalt beginnend mit "Mozilla/x.y bis zum Ende drin).



  • und wie mach ich das mit den auswertungen? :> hab ja gesagt bin noob und wiess noch net wirklich wie ich wann wo welche funktion einsetze usw. ... :{



  • Hm es wird jetzt eine 2te datei geschrieben aber nicht so wie sie sollte! Also keine verkürzung 😕



  • dogeye schrieb:

    und wie mach ich das mit den auswertungen? :> hab ja gesagt bin noob und wiess noch net wirklich wie ich wann wo welche funktion einsetze usw. ... :{

    Dazu mußt du wissen, wie deine Strings ursprünglich aufgebaut sind. Zur Hilfe findest du hier einige hilfreiche Suchfunktionen:
    * zeile.find(wert) gibt die Position zurück, an der der Inhalt von wert in Zeile auftaucht (oder npos*)
    * zeile.find_first_of(menge) gibt den ersten Fundort eines Zeichens aus menge in zeile zurück (oder npos)
    * zeile.substr(start,len) gibt (maximal) len Zeichen beginnend ab start aus zeile zurück
    * zeile==wert fragt ab, ob in zeile und wert (EXAKT) das selbe drinsteht
    * ...

    * string::npos ist ein ungültiger Index und bedeutet "nicht gefunden" - deshalb dürften die Suchfunktionen mit "if(zeile....!=string::npos)..." getestet werden.



  • Wenn du Dir das Parsen wirklich Sparen willst ...

    Auf excel kommst durchaus auch mit C++ drauf ... (muss nich mal VC++ sein)
    Das zauberwort heisst automatisierungsschnittstelle und Active X.

    Du kannst excel als ActiveX Server starten, und dann die Daten natuerlich lesen ...
    Wenn du dich ohnehin mit ActiveX beschaeftigen willst, dann versuchs so ^^
    Erspart Dir auch den Zwischenschritt ueber den Textimport (dauert in der Praxis ca 3 tage bis findige "anwender" perverse Excel makros schreiben die Dir auch das mehr oder weniger umstaendlich automatisieren ^^ )

    Ansonsten musst selber entscheiden ob es dir den Aufwand wert ist, sich mit IDispatch OLEDatentypen und ulkigen VARIANT's rumzuaergern ^^
    Der Einarbeitungsaufwand iss nicht ohne ....

    Naja nebeneffekt waere, dass Dir spaeter mal directX leichter fallen wuerde ^^

    Vielleicht solltest dir mal .Net anschauen, da soll angeblich ne gute ActiveX anbindung bei sein ... zumindest einfacher als mit MFC und ATL und erst recht mit Plain C (ja Active X - Schnittstellen sind C-Schnittstellen ! ^^ )

    Ciao ...



  • lol ^^ zwar kein plan von dem was du geredet hast aber ich werd mich über das aX informieren ^^!

    thx


Anmelden zum Antworten