Fichier txt sd card

Comment rechercher dans un fichier txt sauvegarder sur sd card une chaîne de caractères mais sans charger tout le fichier dans une variable [i] car arduino n a pas beaucoup de ram ?

:warning:

Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans « Les bonnes pratiques du Forum Francophone”

—-

En créant un petit buffer de la taille du texte cherché et en chargeant octet par octet et comparant, vous faites cela fichier par fichier…

Peut on charger ligne par ligne le fichier txt et faire la recherche ligne par ligne ?

On creer le buffer pour une ligne et on inremente la position de 20 40 60 octets selon la grandeur de la ligne quand les caracteres rechercher sont trouver on charge la position trouver et on affiche et chaque ligne doit être de même quantité d octet.

Ensuite charger et afficher la ligne trouver.

Avez vous un exemple de code pour arduino ?

Merci.

On peut visualiser directement mais limiter au buffer et ram de arduino, je veux seulement afficher une ligne après la recherche avec un fichier plus grand.

horlogelcd_rep.zip (3,8 Ko)

Avec le shield lcd 16x2 keypadlcd et shield sdcard.

Bonjour arduino322

Voilà un exemple, les explications sont dans le code.
Le fichier utilisé dans cet exemple, DATA00.TXT, contient:

Ligne une de donnees
Ligne deux de donnees
Ligne sept de donnees
Ultime ligne

Attention à cette ligne:

const int sdCardCsPin = 9;     // Chip Select du lecteur de carte SD

A ajuster selon ton hardware.
Le code:

/*
    Created:	10.10.2021
    Author:     jpbbricole
*/
 
//===================================== Carte SD
#include <SPI.h>     // Interface pour carte SD
#include <SD.h>

const int sdCardCsPin = 9;     // Chip Select du lecteur de carte SD

const char* dataFileName = "DATA00.TXT";

void setup()
{
	Serial.begin(115200);
	delay(500);
  
	//------------------------------------- Demarrage carte SD
	Serial.println(F("Initialisation carte SD..."));
	if (!SD.begin(sdCardCsPin))     // Si la carte SD ne repond pas
	{
		Serial.println(F("Carte SD out ou absente"));
		return;
	}
	Serial.println(F("Carte SD OK\n"));

	delay(1000);
	
	String chaineAchercher = "sept";
	String ligneTrouvee = dataSearchInFile(chaineAchercher);
	
	Serial.print(F("Chaine >> ")); Serial.print(chaineAchercher);
	if (ligneTrouvee != "")     // Si chaîne trouvée
	{
		Serial.print(F(" << trouvee dans dans la ligne >> ")); Serial.print(ligneTrouvee);
	} 
	else
	{
		Serial.println(F(" << INCONNUE !!"));
	}
}

void loop()
{

}

/*
	Recherche de textToSearch dans les lignes du fichier dataFileName
	retourne la première ligne où l'occurence a été trouvée
	Si l'occurence pas trouvée retourne ""
	La recherche est sensible à la casse (case sensitive)
*/
String dataSearchInFile(String textToSearch)
{
	String dataLine;

	File dataFile;
	dataFile = SD.open(dataFileName, FILE_READ);     // Ouvrir le fichier de données
	
	if (dataFile)
	{
		while (dataFile.available())
		{
			dataLine = dataFile.readStringUntil('\n');     // Lire fichier jusqu'à nouvelle ligne
			dataLine = dataLine.substring(0,dataLine.length()-1);     // Supprimer le caractère nouvelle ligne \n
			if (dataLine.indexOf(textToSearch) != -1)
			{
				dataFile.close();
				return dataLine;
			} 
		}

		dataFile.close();
	}
	else
	{
		Serial.print("error opening ");
		Serial.println(dataFileName);
	}

	return "";
}

Cordialement
jpbbricole

La recherche se fait 14 fois soit 196 pour la position seek puis plus d affichage de la variable de 13 octet par ligne.

Es que file.seek est limiter ?

On incrémente de 14 à chaque ligne 14x14=196

horlogelcd_rep5.zip (3,9 Ko)

Bonsoir arduino322

Mets moi un exemple de fichier ainsi un exemple de recherche.

A+
jpbbricole

  current=millis();

   if((current-previous) > 1000 && (index==-1)) {
     previous=current;

      if ((fonct==1)&&(f==0)) {
        ++f;
        b=b+14;
    myFile = SD.open("rep.txt"); 
    
   myFile.seek(b);

    if (!myFile) { 
    Serial.println("Erreur d'ouverture du fichier");
     return;

   }
   taille=13;    

    char chaine[taille];

// init de la chaine, de la taille de celle du fichier

int i=0;
while (myFile.available()) {
  chaine[i] = myFile.read();  //
  
  i++;
  if (i==13){
    return;
  }
  
  ee=chaine;
  
}

    myFile.close();

chaine[i] = '\0';

    }
    delay(20);
    f=0;
    
     }

   index = ee.indexOf(rep);
   shield.setCursor(0,1);

   shield.print(rep);

   shield.print(String(ee[a])+String(ee[a+1])+

   String(ee[a+2])+String(ee[a+3])+
   String(ee[a+4])+String(ee[a+5])+
   String(ee[a+6])+String(ee[a+7])+
   String(ee[a+8])+String(ee[a+9])+
   String(ee[a+10])+String(ee[a+11]));

Recherche la variable rep.
La variable b position s incrémente toujours après
196 mais la variable ee ne s affiche plus à partir de la 15 positions.

Pourquoi on affiche 12octets par ligne et seulement 14 lignes est afficher ?

Merci.

Merci d'éditer ton post et de mettre le code entre balise.
En l'état le code est difficile à lire et il est mélangé avec tes commentaires.

Bonjour arduino322

J'avoue ne pas comprendre le post #7 par rapport à la question de départ?

As-tu essayer mon programme du post #4, est-ce qu'il répond à ta question:

Cordialement
jpbbricole

current=millis();
     if((current-previous) > 500 && (index==-1)){
previous=current;
     
      if ((fonct==1)&&(f==0)) {
        ++f;
        
    myFile = SD.open("rep.txt"); // ouvre le fichier
  b=b+14;       
  myFile.seek(b);

  if (!myFile) { // test si l'ouverture a foirée
  Serial.println("Erreur d'ouverture du fichier");
  return;

  }
  ee.reserve(12);
  taille=12;    // myFile.size();  
  
   char chaine[taille];
   // init de la chaine, de la taille de celle du fichier

   int i=0;
   
   while (myFile.available()) {
   for (int i=0;i<=13;i++){
   chaine[i] = myFile.read();  /
  
    ee=String (chaine);
   
    }


    myFile.close();

    chaine[i] = '\0';

     }  
        }
    delay(20);
    f=0;
   
     }
   index = ee.indexOf(rep);
   shield.setCursor(0,1);
   //shield.print(index);

   if (fonct==0){
   shield.print(rep);
   }
 
 shield.print(String(ee[a])+String(ee[a+1])+

 String(ee[a+2])+String(ee[a+3])+
 String(ee[a+4])+String(ee[a+5])+
 String(ee[a+6])+String(ee[a+7])+
 String(ee[a+8])+String(ee[a+9])+
 String(ee[a+10])+String(ee[a+11]));

Je voudrais faire un tri par ordre alphabétique ensuite réécrire dans un autre fichier.

Comment trier ?

On compare à A la variable String puis on ecrire dans le nouveau fichier tous les String=A,B,C etc.

horlogelcd_rep9.zip (4,1 Ko)

Lettre A ensuite b etc puis fonction 2 pour trier.
Reset après chaque tri.

Rajouter &&xxxxxxxxxx en fin de fichier rep.txt pour finir le tri d un répertoire téléphone.

Comment peut on écrire sur plusieurs lignes une variable alphanumérique avec les boutons du keypadlcd 16x2 ?

Ca sert à quoi d'aligner tous ces messages qui n'ont aucun rapport avec la question sans explications?
Encore un sujet ouvert par @arduino322 qui vire au grand n'importe quoi comme celui ci

Pour ce sujet ça concerne Fichier txt sd card.

Je dirais bien : qsort()

Quant à utiliser qsort(), avec un grand nombre de strings, avec un ARDUINO, il me semble que la cible n'est pas la bonne.

S'il s'agit de trier un fichier en le lisant ligne par ligne, la tâche me semble ardue.

  1. Il faut lire le fichier SOURCE ligne par ligne, et écrire toutes les lignes qui commencent par 'A' dans un fichier DESTINATION, ensuite revenir au début, faire la même chose avec 'B', puis 'C', etc.
  2. Ensuite, renommer DESTINATION en SOURCE
  3. faire la même chose qu'en 1) avec la deuxième lettre, et ainsi de suite.
    Autant dire que cela va prendre ... un certain temps.

Ce fichier provient bien de quelque part ? D'un PC je suppose ?
Alors pourquoi ne pas écrire un fichier déjà trié sur la SD ? ? ?

Ce fichier arduino tri sur la première lettre.

On peut créer sur pc le rep.txt au format AINSI, débrancher et rebrancher arduino après avoir mis la sdcard, laisser arduino trier.

Keypadlcd shield et sd card shield

repertoire_tel1.zip (4,8 Ko)

Oui, mais on peut aussi trier les données sur le PC avant enregistrement sur la SD, ce qui serait beaucoup plus intelligent.

Et comme pour le sujet précédent, je vais utiliser tracking -> mute.
Dommage que l'on ne puisse pas passer un utilisateur en mute, je le ferais sans hésiter.
Bye Bye.

Il y a cette option


C'est pas parfait mais y'a pas mieux.

Merci, c'est fait, c'est toujours mieux que rien.