dat-File einlesen und untersuchen



  • Hallo,

    ich habe eine Frage die bestimmt jemand beantworten kann. Ich möchte ein dat-File öffnen und die dort befindlichen Werte einlesen. Das habe ich bis jetzt noch nie getan. Problem ist das besonder Format. Eine Datei ist wie folgt aufgebaut:

    Sensor-ID = 46
    Beschreibung = E-total  SB 12159 (poly)
    Faktor = 1
    Offset = 0
    startwert = 0
    endwert = 1.2e+06
    Anzahl Datensaetze = 82213
    1072940640	01.01.2004 08:04:00	3354.16
    1072940760	01.01.2004 08:06:00	3354.16
    1072940880	01.01.2004 08:08:00	3354.16
    1072941000	01.01.2004 08:10:00	3354.16
    1072941120	01.01.2004 08:12:00	3354.16
    1072941240	01.01.2004 08:14:00	3354.16
    1072941360	01.01.2004 08:16:00	3354.16
    1072941480	01.01.2004 08:18:00	3354.16
    1072941600	01.01.2004 08:20:00	3354.16
    1072941720	01.01.2004 08:22:00	3354.16
    1072941840	01.01.2004 08:24:00	3354.16
    1072941960	01.01.2004 08:26:00	3354.16
    1072942080	01.01.2004 08:28:00	3354.16
    1072942200	01.01.2004 08:30:00	3354.16
    1072942320	01.01.2004 08:32:00	3354.16
    1072942440	01.01.2004 08:34:00	3354.16
    1072942560	01.01.2004 08:36:00	3354.16
    1072942680	01.01.2004 08:38:00	3354.16
    1072942800	01.01.2004 08:40:00	3354.16
    1072942920	01.01.2004 08:42:00	3354.16
    1072943040	01.01.2004 08:44:00	3354.16
    1072943160	01.01.2004 08:46:00	3354.17
    1072943280	01.01.2004 08:48:00	3354.17
    1072943400	01.01.2004 08:50:00	3354.17
    1072943520	01.01.2004 08:52:00	3354.17
    1072943640	01.01.2004 08:54:00	3354.17
    

    Die ersten 6 Zeilen sind nicht wichtig. Ich möchte aber den Rest einlesen oder auf einen bestimmten Wert zugreifen können.
    Das Erste ist die ID, die am Anfang steht. Danach folgt ein TAB-Einschub. Dann das Datum gefolgt von der Uhrzeit. Diese Daten sind sehr wichtig für mich. Getrennt sind diese durch ein Space. Im Anschlusss (auch sehr wichtig) der Wert. Mit einem TAB-Einschub vom Rest getrennt. Wie bekomme ich die Daden aus den einzelnen Zeilen gefiltert und den Index der Zeile?
    Bitte helft mir. Habt ihr ein Quelltextbeispiel?



  • Liegen denn die Daten wie gezeigt im *.dat-File oder ist das schon eine interpretierte Variante von Binärdaten?



  • Die Werte liegen wie dargestellt in dem *.dat-File. Es sind keine Binärwerte. Im Grunde würde ich jeden Wert gerne als AnsiString haben wollen.



  • Mit TStringList einlesen
    Jeden String in der Liste durchlaufen und mit SubStr zuerlegen.



  • Hallo

    Du kannst jede beliebige Textdatei unabhängig von der Dateiendung mit den üblichen Mitteln wie std::ifstream oder TStringList öffnen. Letzeres ist im Builder wohl die direkteste Variante um AnsiString zu bekommen. Siehe BCB-Hilfe, FAQ und Forumsuche hier im BCB-Forum zum Umgang mit TStringList.

    bis bald
    akari



  • Hi...

    Also ich würde für die Daten eine Struktur anlegen und diese dann in einem
    Vector oder einer Liste speichern. Eine Map wäre vielleicht auch nicht schlecht
    hier könntest du die ID als Key verwenden und den Rest der daten als Value.

    Hier mal ein Beispiel mit nem Vector:

    #include <string>
    #include <vector>
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    //Struktur für die Daten
    struct Data
    {
    	string id;
    	string date;
    	string time;
    	string value;
    };
    
    int main(void){
    
    	Data* dat;					   //Pointer auf die Daten-Struktur
    	fstream file;					//Filestream
    	string buffer;				   //Hilfsvariable
    	vector<Data*> datalist;		  //Vector mit Pointern auf die Daten
    
    	//Datei zum lesen öffnen
    	file.open("data.dat", ios::in);
    
    	//Wenn öffnen erfolgreich 
    	if (file.good()){
    
    		//Die ersten 7 Zeilen überspringen
    		for (int i=0;i<7;++i){
    			getline(file,buffer);
    		}
    
    		//Daten in die Struktur lesen und in den Vector packen
    		while(file>>buffer){
    			dat = new Data;
    			dat->id = buffer;
    			file>>dat->date;
    			file>>dat->time;
    			file>>dat->value;
    			datalist.push_back(dat);
    		}	
    	}
    }
    

    In dem Beispiel sind alle Daten als string angelegt, müsstest du dann eventuell
    während des einlesens noch in deine gewünschten Datentypen umwandeln.



  • Hallo,

    Ich würde das so machen.

    std::vector<std::string> str_vect;
    std::string tstr;
    std::ifstream ein("data.dat");
    while( getline(ein, tstr)) str_vect.push_back(tstr);
    size_t count(str_vect.size());
    if( count < 8 )
    {
    // Fehlerbehandlung
    } else
    {
      std::stringstream str;
      std::string s1, dat1, dat2;
      double d1;
      for( size_t i=6; i<count; ++i)
      {
        str.str(str_vect[i]);
        str >> s1 >> dat1 >> dat2 >> d1; //jetzt kannst du mit deinen Daten irgendwas machen
      }
    }
    

Anmelden zum Antworten