C# Datei einlesen, aber Lücken überspringen



  • Hi.

    Ich bin gerade dabei, eine Radiosondendatei einzulesen. Das Problem dabei besteht allerdings darin, dass ab und zu Datenlücken in der Datei auftreten, die dann beim Einlesen der Datei übersprungen werden sollen.

    Hier ein Beispiel:

    76  0     47.7    20768     -60.3      3  //////                           
      76  5     47.5    20785     -60.1      3  //////                           
      76 10     47.3    20812     -59.8      3  //////                           
      76 15     47.1    20843     -59.7      3  //////                           
      76 20     47.1    20847     -59.6      3  //////                           
      76 25     47.9    20731     -59.0      5  //////                           
      76 30     48.6    20639     -59.0      8  //////                           
      76 35     52.4    20176     -61.0     12  //////                           
      76 40     53.8    20012     -63.7     13  //////                           
      76 45     55.3    19839     -66.3     12  //////                           
      76 50     60.5    19303     -71.3     11  //////                           
      76 55     61.3    19226     -73.4     12  //////                           
      77  0     63.1    19063     -73.4     11  //////                           
      77  5   //////    18739    //////    ///  //////                           
      77 10   //////    18415    //////    ///  //////                           
      77 15     74.7    18091     -80.0      8  //////                           
      77 20     74.0    18141     -80.3      8  //////                           
      77 25     80.0    17703     -83.3      8  //////                           
      77 30     80.0    17703     -83.3      8  //////                           
      77 35     83.7    17452     -83.2      8  //////                           
      77 40    100.0    16464     -81.8    127  //////                           
      77 45    100.0    16464     -81.8    127  //////                           
      77 50   //////    16327    //////    ///  //////                           
      77 55   //////    16191    //////    ///  //////                           
      78  0   //////    16054    //////    ///  //////                           
      78  5   //////    15918    //////    ///  //////                           
      78 10    112.7    15781     -76.2     10  //////                           
      78 15   //////    15617    //////    ///  //////                           
      78 20   //////    15453    //////    ///  //////                           
      78 25   //////    15288    //////    ///  //////                           
      78 30   //////    15124    //////    ///  //////                           
      78 35   //////    14960    //////    ///  //////                           
      78 40   //////    14795    //////    ///  //////                           
      78 45   //////    14631    //////    ///  //////                           
      78 50   //////    14467    //////    ///  //////                           
      78 55    145.0    14302     -69.1     16
    

    Die 'wichtigsten' Zeilen meiner Einleseroutine sind folgende:

    i=1;
    while (feof(sonde)==0) 
    {
      fgets(buf,80,sonde);
      sscanf(buf,"%d %d %f %f %f %f %d \n",&dum[i] &dum[i] &ppp[i],&H[i],&T[i],&RH[i],&dum);
      i++;
    }
    

    Jaa, wenn ich jetzt also für ppp, H, T, RH diese '/' erhalte, ist die eingelesene Zeile 'i' fehlerhaft und das Programm soll in die nächste Zeile weiterspringen. Wie schaffe ich es einen derartigen Fehler auf diese Weise abzufangen und zu bearbeiten?

    Vielen Dank für die Hilfe,
    Patric.



  • Prüf doch ob einer der Strings (ppp, H, T oder RH) mit '/' beginnt - wenn das der Fall ist einfach mit continue wieder zum Schleifenanfang springen.

    MfG SideWinder



  • Hi danke für die Antwort.
    Das Problem ist allerdings, dass die Sache, so wie ich sie meines Wissens nach durchführen würde, nicht funktioniert.
    Ich schaue mir also zuerst die mit fgets eingelesene Zeile nur bezüglich des 3. Wertes in der Tabelle an(Luftdruck). Wenn dann der eingelesene String 'teststring'="//////" ist, soll das Proggi so lange die Zeilen überlesen, bis keine "//////" mehr (sondern dementsprechend ordentliche Werte) in der Tabelle stehen.

    Das Problem ist hier nur, dass der Vergleich teststring="//////" nicht funktioniert.

    Was mache ich da falsch?

    char teststring[6];
    while (feof(sonde)==0) 
           {
             fgets(buf,80,sonde);         
             sscanf(buf,"%d %d %s %f %f %f %d",&dum, &dum, &teststring,&dum, &dum, &dum, &dum);
             while (teststring=="//////") 
             {
               fgets(buf,80,sonde);
               printf("check"); //nur als Test, dass er in der Schleife ist
               sscanf(buf,"%d %d %s %f %f %f %d",&dum, &dum, &teststring,&dum, &dum, &dum, &dum);
             }; 
    
             sscanf(buf,"%d %d %f %f %f %f %d",&dum, &dum, &ppp,&H,&T,&RH,&dum);
    


  • Strings vergleicht man mit strcmp() und nicht mit == 😉



  • Grmmml!

    Hätt ich gleich drauf kommen können bei google nach "strings vergleichen" zu suchen, um dieses Problem zu lösen.

    Vielen Dank. Mit strcmp() klappt alles bestens und so wie ich es mir erträumt habe! 😃



  • Hab noch eine andere, angenehmere Art gefunden, diese Fehler in den files zu verarbeiten.
    der Befehl sscanf liefert den Wert der ordentlich eingelesenen Variablen zurück. In Zeilen, wo anstatt einer float ein '/////' drin steht, liest er weniger Variablen ein.
    nutzen kann man das in etwa so:

    anzvar=sscanf(buf,"%d %d %f %f %f %f %d",&dum, &dum, &ppp,&H,&T,&RH,&dum);
    if (anzvar!=6)
    {
      mache was bestimmtes
    }
    

Log in to reply