Datei einlesen und grafisch auswerten



  • Hi

    Hat jemand eine Idee, wie ich eine Datei sinvoll einlesen kann und diese dann grafisch auswerten?

    Hier einmal die Strucktur:

    //Informationen zur Datei
    Filename:;T0001P0001D22042004T162432;
    AV 95 ACE;
    ADS (Version 1.0);
    Spur;1;
    Ueberfahrt;1;
    Datum:;22.04.2004;
    Uhrzeit:;16:24:32;
    Fahrtrichtung;vorw.;
    kB max:;169;MN/m
    kB min:;0;MN/m
    íkB:;110;MN/m
    kB:;110;MN/m
    temp.;27;øC
    Geschwindigkeit;4.9;km/h
    Laenge;1.46937e-37;m
    Raster;10;m
    
    100;//Anzahl Messwerte
    126 //Messwerte
    147
    74
    103
    154
    112
    124
    0
    92
    128
    98
    72
    

    Die Dateiinformation ist nicht das Problem (1. Abschnitt) Aber die Messwerte.
    Diese sollten in einem Liniediagramm dahrgestellt werden. Wie lese ich solche Dateien am Besten ein? Ist es besser in einen String oder währe es wohl besser das ganze in ein Listenfeld einzulesen (Da Jeder Messwert auf einer neuen Zeile ist und ohne ; getrennt ist....

    Kann mir jemand ein Beispiel geben, wie ich die Datei einlesen kann und wie ich Linien zeichnen kann.... (Am Besten in eine Picturebox, da ich eine Vorschau machen muss... (das ganze sollte später ausgedruckt werden...)

    Vielen Dank!



  • Sieht der Dateikopf immer gleich aus und stehen die Messwerte immer an der gleichen Stelle in der gleichen Reihenfolge? Hatte vor kurzem ein ähnliches Problem. Wenn die Messwerte wie bei mir in einer reinen Textdatei zeilenweise getrennt da stehen dann kannst Du sie doch in einer Schleife in einen String einlesen und in eine Zahl umwandeln (dynamische Dateintypen machen nur Sinn, wenn Du nicht weißt, wieviele Messwerte drin stehen), bis das Dateiende erreicht ist. Bei mir waren es ca. 1000 Messwerte, ich habe das immer noch mit statischen Strukturen Array hinbekommen, obwohl man da schon über verkettete Listen nachdenken sollte. Allerdings ist das Handling mit dynamischenn Strukturen nicht ganz einfach (Zeiger, Speicherreservierung und -freigabe).



  • Hi

    Also der Dateikopf ist immer gleich (Einfach die Werte unterscheiden sich...)
    Die Anzahl der Messwerte ist aber sehr verschieden. kann von ca. 2 bis 200000 Messwerte oder noch mehr sein...
    Kann ich es aber nicht trotzdem in einen String einlesen und dann Zeilenweise ansprechen?

    kannst du mir nicht ein Beispiel posten?
    Vielen Dank!



  • also wenn der dateikopf immer gleich ist, würde ich das folgendermassen machen:
    du öffnest die datei mit einer CStdioFile. dann leist du die zeilenweise ein, zb. mit dateiname.ReadString(deinstring).
    in diesem String kannst du dann über die funktionen find, findoneof, die zahlenwerte und art erkennen und die in eine struktur oder ähnliches speichern.



  • Sorry aber i verstehe dies nicht ganz!
    Ich bin ziemlich neu (Habe noch nie so etwas aus einer Datei gelesen)
    Was ist ein CStdioFile?
    Wie setzte ich den dateiname.ReadString(deinstring) richtig ein?
    Was bewirkt find und findoneof?

    Kannst du mir nicht ein kurzes Beispiel posten wie ich es realisiere?



  • {
    	CString LineToRead, helpstring;
    	CStdioFile datei;
    	datei.Open("deinedatei", CFile::modeRead); // Datei öffnen
    	datei.SeekToBegin();
          for (int i = 0; i < zahl /*beginn der messwerte*/; i++)
          { 
          datei.ReadString(LineToRead); //Dateikopf solange einlesen, bis Messwerte erreicht
    	}//messwerte erreicht
          datei.ReadString(LineToRead);
          while(!LineToRead.IsEmpty())
          {	
          pos = LineToRead.Find(" "); // Leerzeichen suchen: Wert zuende
    	helpstring = LineToRead.Left(pos); // in einen string speichern
          datei.ReadString(LineToRead);
          }
    }
    

    habe den code zwar gekürzt, aber müsste trotzdem funktionieren. es müsste auch möglich sein, die werte anschliessend in ein array zu übertragen, bspw über formatierung in double-werte, um das dann grafisch darzustellen.
    find und findoneof sind funktionen der klasse cstring, damit kann man strings auf bestimmte zeichen und zeichenfolge untersuchen,schau dir am besten mal die memberfunktionen der cstring klasse in der msdn an.



  • Vielen Dank!

    Wie kann ich dann die Messwerte im String (Variblen) ansprechen? Oder besser gesagt, wie kann ich dann die einzelnen Messwerte herausholen?



  • du hast in dem string jeweils nur einen messwert, er liest ja eine zeile ein, sucht das ende des messwertes und speichert diesen dann in den helpstring. was ich da grade vergessen habe, ist, dass du den wert noch umspeichern musst, in ein array oder sowas. und zwar am besten, bevor du die neue zeile einliest, also direkt nach dem befehl
    helpstring = LineToRead.Left(pos)



  • ok das leuchtet mir ein.
    Aber dann habe ich ja am Schluss einen Arrey mit z.B 200 Messwerten. Wie finde ich denn dann noch den Messwert?

    Funktioniert dies so: helpstring = helpstring & LineToRead.Left(pos) & ";"

    Ich möchte einfach immer nach dem Messwert ein ; einfügen damit ich dann später das ganze wieder teilen kann?!?!?!



  • addict schrieb:

    ok das leuchtet mir ein.
    Aber dann habe ich ja am Schluss einen Arrey mit z.B 200 Messwerten. Wie finde ich denn dann noch den Messwert?

    naja, du kannst ja jeden messwert in einem eigenen element speichern und dann über ein for-schleife ansteuern.

    addict schrieb:

    Funktioniert dies so: helpstring = helpstring & LineToRead.Left(pos) & ";"

    eher so:

    allemesswerte.insert(";");
    int stringende = allemesswerte.GetLength();
    allemesswerte.insert(stringende, helpstring);

    die genauen funktionen stehen in der msdn bei cstring, class members. wenn du das gemacht hast, müsste da so ein string rauskommen:
    mw1;mw2;mw3;....

    addict schrieb:

    Ich möchte einfach immer nach dem Messwert ein ; einfügen damit ich dann später das ganze wieder teilen kann?!?!?!

    bin mir jetzt nicht mehr so sicher, ob ich das richtig verstanden habe, was du machen möchtest. wenn du ein array mit den messwerten anlegst, hat das für jeden wert ein element. da ist dann quasi jeder messwert einzeln



  • Ich möchte im Prinzip einfach alle Messwerte in einer Variablen haben, damit ich später ein Diagramm (in einer schlaufe) zeichnen kann das ganze mit einfachen Linien.



  • dann würde ich das in ein array einlesen, da kannst du dieses array durch eine for-schleife auslesen, dann kannst du jeden einzelnen messwert auswerten und weiterverarbeiten, also array[nr messwert] = wert messwert.
    in dem fall solltest du allerdings den cstring über cstring.format in ein double-wert umrechnen.



  • Sorry aber ich verstehe das schon wieder nicht ganz!
    Wie würde denn nun das einlesen und dann diese for-Schlaufe aussehen?
    Könntest du mir nicht ein Beispiel posten?

    Vielen Dank für deine Bemühungen!!!!



  • einlesen und in array speichern. am besten global deklarieren: double array[10000]

    {
    	CString LineToRead, helpstring;
    	CStdioFile datei;
          int lauf = 0;
    	datei.Open("deinedatei", CFile::modeRead); // Datei öffnen
    	datei.SeekToBegin();
          for (int i = 0; i < zahl /*beginn der messwerte*/; i++)
          { 
          datei.ReadString(LineToRead); //Dateikopf solange einlesen, bis Messwerte erreicht
    	}//messwerte erreicht
          datei.ReadString(LineToRead);
          while(!LineToRead.IsEmpty())
          {	
          pos = LineToRead.Find(" "); // Leerzeichen suchen: Wert zuende
    	helpstring = LineToRead.Left(pos); // in einen string speichern
          array[lauf] = helpstring.Format()//da fehlen noch parameter, weiss aber nicht mehr welche.
    //allerdings musst du das cstring in einen double wert formatieren.      
          lauf++;
          datei.ReadString(LineToRead);
          }
    }
    

    mit dem helpstring.Format musst du mal etwas experimentieren, da müsste es auch schon einträge hier im forum zu geben. und halt die msdn.
    nun das auslesen:

    for (int i=0; i<lauf; i++)
    tue irgendwas mit array[lauf], das ist der messwert
    

    mit der schleife gehst du einmal durch das gesamte array, und kannst jeden messwert verarbeiten.



  • Im Prinzip ist das schon richtig was Daniel schreibt. Du musst nur aufpassen wenn Du mit den Messwerten arbeiten willst. In der Regel wird Dein Array immer größer sein wie die Anzahl Deiner Werte. Wenn Du Berechungen damit anstellen musst (ich habe bei meinen Messwerten die Standardabweichung Medianwert, Varianzenkoeffizient zu berechnen) darfst Du nicht über den letzten Wert herausschießen. Bei Arrays ist ja eigentlich der Vorteil, dass in einfachen Schleifen über Hochzählen des Feldindexes solche Berechnungen sehr einfach zu implementieren sind. Sind die Arrays größer wie die Anzhal der Messwerte funktioniert das nicht mehr.
    Ein Einlesen aller Werte in einen CString mit einem Trennzeichen (m1;m2;m3;...) würde ich nicht machen. Dann muss man wieder mit Positionszeigern arbeiten oder die Trennzeichen detektieren. Sind unnötige Fehlerquellen. Machs wie vorgeschlagen: in einer Schleife die Datei ab der Position des ersten Messwertes in eine Hilfsvariable vom Typ String/CString einlesen und dann sofort in eine Zahl umwandeln und in ein Array speichern.


Anmelden zum Antworten