csv daten auslesen und bearbeiten



  • ich habe ein problem, und zwar ist es meine aufgabe aus einem csv file die beinhalten daten zu analysieren und eine statistic über dieses log file zu erstellen. im moment ist mir noch nicht eingefall wie ich z.b gewissen dinge später extrahieren kann um sache damit zu berechnen. beispiels weise die zeit differenzen von verschiedenen einträge. jede zeil stellt einen auszuweretenden eintrag ein.

    hier ein kleiner ausschnitt des log files:

    esult;Date;Time;HiPath;SLMY;Physical Lines;Routing Lines;Total Ports;Number
    DEF PL;13.10.2005;10:15:55;HiPath AA;SLMY 1.66.2;0/17* (0%/100%);0/74 (0%/100%);0/91* (0%/100%);83064

    DEF PL;13.10.2005;10:15:55;HiPath AA;SLMY 1.66.1;0/25* (0%/100%);2/74 (2%/100%);2/99* (2%/100%);83065

    FAILED;13.10.2005;10:15:55;HiPath AA;SLMY 1.11.2;;;;83066
    FAILED;13.10.2005;10:16:06;HiPath AA;SLMY 1.11.1;;;;83067
    OK;13.10.2005;10:16:10;HiPath AA;SLMY 1.66.3;2/15 (13%/100%);10/74

    (habe bei einpaar einträge extra ein umbruch gemacht da si zusammen gehören und eigentlich auf der gleichen zeile sind)

    kommt einen von euch vileicht eine idee



  • auslesen mit fstream.getline() in einen String, dann kannst du dort durchgehen, nach ";" suchen und die einzelnen Teilstrings auseinandernehmen:

    string full_line;
    fin.getline(full_line);
    
    vector<string> split_line;size_t pos
    while( (pos=full_line.find(";")) != string::npos)
    {
      split_line.push_back(full_line.substr(0,pos-1));//packe erstes Feld in Array
      full_line.erase(0,pos);//lösche erstes Feld aus Zeile
    }
    split_line.push_back(full_line);//letztes Feld eintragen
    


  • Das erase ist aber nicht notwendig. Man kann sich besser die Position merken an der man gerade ist.



  • ja an so etwas habe ich schon gedacht, nur dann müsst ich jeden string speichern, man muss sich eben vorstellen das es vileicht 500 einträge hat oder vileicht auch nur 50, das ist alles variable und später muss ich von diesen daten mir die wichtigen daten rausholen, dann ist nicht immer der ganze string wichtig. z.b brauche ich die zeit vom ersten eintrag und die zeit vom letztem, oder muss von diesen slmy alle zusammen suchen und von denen eine statisik machen. darum bi ich mir nicht sicher ob das optimal wäre



  • ist es beispiels weise möglich die zeilen zahl ausfindig zu machen und dies dann speichern, damit ich später genau weiss welche spalten ich benötige um meine statisk zu berechnen. so könnte ich immer de eingelsen string wieder löschen



  • Ja, aber das ist recht aufwendig (dazu müsstest du die ganze Datei durchlaufen und die Newlines zählen). Wenn du auf der selben Datei mehrere Auswertungen starten willst, ist es je nach Größe vermutlich besser, sie komplett einzulesen und in einem "vector<vector<string> >" zu verstauen oder jedes Mal sequentiell durchzugehen, um die richtigen Werte auszufiltern.



  • Du könntest den ein 2 dimensonalen Vektor benutzen (vector<vector<string> >) oder eine Liste um den Vector packen (list<vector<string> >) und dann auf Zeilen und Spalten einzeln zugreifen und hättest nicht alles wie oben gezeigt in einem eindimensionalen Vektor wo alles hintereinander gespeichert wird.

    Edit: Zu langsam 🙂



  • vecktoren habe ich eigentlich nicht in erwähgung gezogen da das ganz zimlich langsam werden würde weil wenn das log file z.b 500 zeilen hat, ausserdem müsste ich wenn ich eine vector benutze auf generic lösungen zugreifen wie list oder bag, und mit denen bin ich nicht sehr vertraut und würde sie nur anwenden wenn es wirklich nicht anders geht. ich habe mir eifach gedacht di beste lösung wer schon eine in der ich die daten grundsätzlich in der datei belasse und nur zu statistik berechnung sie einlesen lasse, aber wie genau ich dies umsätzen kann ist mir noch nicht eingefallen



  • da fällt mir nur eine Möglichkeit ein, aus einer Eingabezeile ein einzelnes Element rauszuziehen:

    for(int i=0;i<snum;++i)
    {
      pos=full_line.find(";",pos+1);
      if(pos==string::npos)break;
    }
    pos2=(pos!=string::npos)?full_line.find(";",pos+1):0;;
    part_line=full_line.substr(pos,pos2-pos-1);
    

    (snum ist die betrachtete Spalte (von 0 gezählt) - in eine Zahl mußt du es notfalls selber umwandeln)



  • snum, was ist das für ein typ? aso wenn ich richtig verstanen habe steht im snum die zeilen zahl drinnen?


Anmelden zum Antworten