Exclure les retours à la ligne

Bonjour,
J'ai besoin de votre aide concernant une exclusion de retour à la ligne.

Le but de mon projet est de lire un fichier texte puis l'exploiter. Actuellement, j'ai réussi à faire cela uniquement avec une seule ligne de ce fichier texte où des données thermiques séparées par des tabulations apparaissent.
Maintenant je dois faire la même chose mais comme cette fois-ci le fichier texte contient beaucoup plus de lignes, il faudrait que je sois capable d'éliminer les 5 premières lignes qui sont uniquement le titre etc... Puis le numéro de ligne à la gauche à chaque fois pour lire le restant des données.

Comme dit précédemment j'ai déjà reçu de l'aide de la part de @kamill pour lire les données séparées par les tabulations sur une seule ligne maintenant il faut que je réussisse à faire de même mais sur un fichier complet en excluant les 5 premières lignes + le numéro de chaque ligne.

Voici mon code

#include <SPI.h>
#include <SD.h>
#include <String.h>
File myFile;
char c;

String readStg;

void setup() {
  Serial.begin(9600);
  //Il est montré à l'écran que la communication avec le SD va commencer
  Serial.println("Communication avec la carte SD...");

  //Le moniteur indique si la communication a été établie correctement
  //ou il y a eu un type d'erreur.
  if (!SD.begin(4)) {
    Serial.println("La communication a échouée");
    return;
  }
  Serial.println("La communication a démarrée correctement");

  /*                    LECTURE DE DONNÉES DANS LA MÉMOIRE SD DE ARDUINO                 */

  //Le fichier est ouvert à nouveau, cette fois pour lire les données écrites.
  myFile = SD.open("IR000140.txt");

  //Si le fichier a été ouvert correctement, les données sont affichées.
  if (myFile) {

    //Le moniteur indique les informations qui apparaîtront dans
    //test.txt

    //Une boucle est implémentée qui parcourt le fichier jusqu'à ce qu'il n'en trouve plus

    /* RECHERCHE DE LA PREMIERE DONNEE THERMIQUE */

    while (myFile.available()) {
      c = myFile.read();
      if (c == '\t')
        verif();
      //stock des caractères dans une chaîne
      if (c != 0 && c != (char)0xff && c != (char)0xfe && c!='\t')
      {
        if (c==',')
          c='.';
        readStg += c;
      }
    }
   

    /* FIN DE LA RECHERCHE */

    //Si tout s'est bien passé, fermer le fichier pour ne pas perdre les données
    myFile.close();
  }

  //Au cas où il y aurait eu des problèmes pour ouvrir test.txt, celui-ci sera affiché à l'écran.
  else {

    Serial.println("Le fichier test.txt ne s'est pas ouvert correctement");
  }
}

void loop() {
}

void verif() {
    Serial.println("\nLecture de la donnée thermique");
    Serial.println(readStg); //Affichage de la donnée

    float  resultat = atof(readStg.c_str());
    Serial.println("\nRetour en décimal...");
    Serial.println(resultat);

     if (resultat < 81.5) { // Indiquer le caractère à rechercher

Serial.println("\nLe caractère recherché est présent dans le fichier");
}

    delay(1000);

    readStg = "";
}

Bon là j'arrive à lire etc sur la première ligne.

J'ai pensé à faire ça en ajouter les OU '\n'

if (c == '\t' || c=='\n')
        verif();
      //stock des caractères dans une chaîne
      if (c != 0 && c != (char)0xff && c != (char)0xfe && c!='\t' || c!='\n')

Mais ça ne marche malheureusement pas puisque je ne sais pas comment exclure les premières lignes.
Je vous met à disposition mon texte.

Je vous remercie en avance de m'aider. Merci

IR000140.txt (190 KB)

Si tu as créé le fichier sous Windows il y a de fortes chances que les lignes se terminent par '\r' et '\n'.

Pour exclure les 5 premières lignes ajoute une variable compteur qui compte le nombre de fois que tu lis '\n'.

Merci pour votre indication, je vais essayer d'effectuer cela ^^

hbachetti:
Si tu as créé le fichier sous Windows il y a de fortes chances que les lignes se terminent par '\r' et '\n'.

Pour exclure les 5 premières lignes ajoute une variable compteur qui compte le nombre de fois que tu lis '\n'.

Vous n'avez pas un exemple à me donner parce que là je bug un peu :S

dans setup (ou, si on veut $être plus général, après l'ouverture du fichier)
mettre compteur à zéro
tant que ( compteur < 5 ) { (ou transformer une boucle while en for)
lire jusqu'à '\n'
incrementer compteur
}

ensuite, lire une ligne comme avant, en ignorant le '\r' (à rajouter dans le test)

J'ai fait ça pour le moment

 while (myFile.available()) {
      c = myFile.read();
      if (c == '\t')
      lineCount = lineCount + 1
      while (lineCount < 5 ){
        c == '\n'
        lineCount++
      }
        verif();
      //stock des caractères dans une chaîne
      if (c != 0 && c != (char)0xff && c != (char)0xfe && c!='\t')
      {
        if (c==',')
          c='.';
        readStg += c;
      }
    }

Vous en pensez quoi ?

EDIT : Je viens d'essayer ce que je viens de faire et ça ne marche pas, aucune valeur ne s'affiche...

  if (c == '\t')
      lineCount = lineCount + 1
      while (lineCount < 5 ){
        c == '\n'
        lineCount++; 
      }

ne doit pas trop compiler, et ne rendra pas ce que vous voudfrez une fois corrigé syntaxiquement

for ( uint8_t lineCount=0; lineCount <= 5;) { // il manque un champ à  la boucle for; lineCount est incrémenté si necessaire après lecture char après char
 char   c= myFile.read();
 if ('\n' == c) lineCount++;
}

a des chances de compiler, et de sauter 5 lignes (mais sera certainement affreux sur un fichier de 4 lignes: il bouclera...)

Je vois petit à petit le principe sauf que quand je l'intègre à mon programme, plus rien ne s'affiche

  while (myFile.available()) {
      c = myFile.read();
      if (c == '\t')
        verif();
             
      for ( uint8_t lineCount=0; lineCount <= 5;) { // il manque un champ à  la boucle for; lineCount est incrémenté si necessaire après lecture char après char
      char   c= myFile.read();
      if ('\n' == c) lineCount++;
      }
      //stock des caractères dans une chaîne
      if (c != 0 && c != (char)0xff && c != (char)0xfe && c!='\t')
      {
        if (c==',')
          c='.';
        readStg += c;
      }
    }

Sortie :

Communication avec la carte SD...
La communication a démarrée correctement

Mettez ce bout de programme que j'ai osé coder à la volée *** avant ** toute tentative de décodage... (en haut de votre boucle while;

dbrion06:
Mettez ce bout de programme que j'ai osé coder à la volée *** avant ** toute tentative de décodage... (en haut de votre boucle while;

Ah ça marche ! Sauf qu'il prend avec le numéro de ligne tout à gauche (le petit 1, 2, 3, etc).

code en sortie :

Lecture de la donnée thermique
1

Retour en décimal...
1.00


Lecture de la donnée thermique
82.1

Retour en décimal...
82.10

Ah ça marche ! S

Non:
ça semble marcher pour un fichier; si un fichier a moins de 4 lignes, ça va boucler.... (et vous serez très ennuyé si vous reduisez le nombre de lignes dans 6 mois). Il faut rajouter un test sur la fin du fichier....

dbrion06:
Non:
ça semble marcher pour un fichier; si un fichier a moins de 4 lignes, ça va boucler.... (et vous serez très ennuyé si vous reduisez le nombre de lignes dans 6 mois). Il faut rajouter un test sur la fin du fichier....

Je vois, quel type de test devrai-je rajouter ?

Un test judocieux, plus judicieux que ce que je ferais avec du codage à la volée
Que ferait
if (myFile.available()) lineCount=100;
dans la boucle de comptage des fins de ligne (c'est très laid)

dbrion06:
Un test judocieux, plus judicieux que ce que je ferais avec du codage à la volée
Que ferait
if (myFile.available()) lineCount=100;
dans la boucle de comptage des fins de ligne (c'est très laid)

lineCount = 100 est donné au pif ou c'est une valeur fixe ?
Puis oui je viens d'essayé sans condition à la fin du programme avec un texte qui possède qu'une ligne et effectivement, il n'y a rien qui se passe.

Tu élimines les \r et \n
Pour ne prendre que les mesures thermiques tu testes si ta chaine contient une virgule

#include <SPI.h>
#include <SD.h>
#include <String.h>
File myFile;
char c;

String readStg;

void setup() {
  Serial.begin(9600);
  //Il est montré à l'écran que la communication avec le SD va commencer
  Serial.println("Communication avec la carte SD...");

  //Le moniteur indique si la communication a été établie correctement
  //ou il y a eu un type d'erreur.
  if (!SD.begin(4)) {
    Serial.println("La communication a échouée");
    return;
  }
  Serial.println("La communication a démarrée correctement");

  /*                    LECTURE DE DONNÉES DANS LA MÉMOIRE SD DE ARDUINO                 */

  //Le fichier est ouvert à nouveau, cette fois pour lire les données écrites.
  myFile = SD.open("IR000140.txt");

  //Si le fichier a été ouvert correctement, les données sont affichées.
  if (myFile) {

    //Le moniteur indique les informations qui apparaîtront dans
    //test.txt

    //Une boucle est implémentée qui parcourt le fichier jusqu'à ce qu'il n'en trouve plus

    /* RECHERCHE DE LA PREMIERE DONNEE THERMIQUE */

    while (myFile.available()) {
      c = myFile.read();
      if (c == '\t')
        verif();
      //stock des caractères dans une chaîne
      if (c != 0 && c != (char)0xff && c != (char)0xfe && c != '\t' && c!='\r' && c!='\n')
      {
        readStg += c;
      }
    }


    /* FIN DE LA RECHERCHE */

    //Si tout s'est bien passé, fermer le fichier pour ne pas perdre les données
    myFile.close();
  }

  //Au cas où il y aurait eu des problèmes pour ouvrir test.txt, celui-ci sera affiché à l'écran.
  else {

    Serial.println("Le fichier test.txt ne s'est pas ouvert correctement");
  }
}

void loop() {
}

void verif() {
  int index=readStg.indexOf(',');
  if (index<0)
  {
    readStg="";
    return;         // il n'y a pas de virgule -> ce n'est pas une température
  }
  readStg.setCharAt(index,'.');   // remplace , par .
  Serial.println("\nLecture de la donnée thermique");
  Serial.println(readStg); //Affichage de la donnée

  float  resultat = atof(readStg.c_str());
  Serial.println("\nRetour en décimal...");
  Serial.println(resultat);

  if (resultat < 81.5) { // Indiquer le caractère à rechercher

    Serial.println("\nLe caractère recherché est présent dans le fichier");
  }

  delay(1000);

  readStg = "";
}

Tu gères kamill, merci.

Merci à tout les deux !