Go Down

Topic: leggere file .csv da sd card (Read 3485 times) previous topic - next topic

secondsky

Ciao a tutti, è da un po' che non traffico con la libreria sd card.
Mi chiedevo se fosse semplice leggere un file csv, una riga dopo l'altra, come farebbe processing quando invia i file ad arduino, e poi vengono divisi con serial.parseInt.
Gli esempi che ho trovato nella libreria sono su file .txt e non c'era molto "parsing".
Vi ringrazio.

lucadentella

ciao

i metodi base ti consentono di aprire un file e di leggerlo carattere per carattere.
dovresti quindi:

- leggere il carattere e salvartelo in un char[]
- se il carattere è ; hai finito di leggere il campo attuale
- se il carattere è \n (o \r\n se il file è DOS) hai finito di leggere la riga
lucadentella.it

secondsky

Ti ringrazio, mi sembra fattibile.
Il metodo parseInt su arduino è applicabile solo alla seriale quindi?

pitusso

Ciao,
molte librerie per SD ti permettono di aprire un file e leggerlo riga per riga.
Per ogni riga, con la funzione strtok_r ne fai il parse in una sequenza di token, separati da un carattere (nel tuo caso ";")
Quindi riesci ad ottenere in modo veloce i vari valori.

lucadentella

parseInt è un metodo applicabile ad ogni oggetto Stream:
http://arduino.cc/en/Reference/StreamParseInt

SdFile però non è di tale tipo.
lucadentella.it

secondsky


Ciao,
molte librerie per SD ti permettono di aprire un file e leggerlo riga per riga.
Per ogni riga, con la funzione strtok_r ne fai il parse in una sequenza di token, separati da un carattere (nel tuo caso ";")
Quindi riesci ad ottenere in modo veloce i vari valori.


Quindi ci sono altre librerie oltre la SD ufficiale?

pitusso

Quote
Quindi ci sono altre librerie oltre la SD ufficiale?


:smiley-yell: tu quale stai usando?

secondsky

Gli esempi che ho guardato sono quelli compresi nell'IDE.
http://arduino.cc/en/Reference/SD

lesto

usa la fscanf!

esempio se vuoi leggere un intero, poi un float e poi una stringa

int i;
float f;
char s[10];
scanf("%d %f %s", &i, &f, s);
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

secondsky

Dove il numero di caratteri preceduto da "%" è il numero di variabili che ci si aspetta per riga e che vanno a modificare le variaili precedute da "&"?

pablos

#10
Jan 09, 2013, 02:51 pm Last Edit: Jan 09, 2013, 03:03 pm by pablos Reason: 1
Più che riga per riga viene letto un byte alla volta, poi quello cha fa la libreria o lo sketch col parsing è un altro discorso.
il buffer che ottieni dalla SD non è diverso da quello della ethernet shield, dalla seriale, da un hard disk, da un cdrom.
tutto dipende dall' archiaviazione dei dati sul supporto, più semplice sarà il criterio di scrittura, più semplice e veloce sarà il recupero.
Ci lavoro da un anno con archivi di dati su SD che tipo di dati vuoi estrarre dal file?  o meglio come sono composte queste linee? quanti dati ci sono su una linea prima di incontrare  "/n"

ciao
no comment

secondsky

Per esempio un csv con linee composte da quattro variabili.
Per esempio:
1,0,11500,6430
1,0,11550,6435
1,0,20000,6700
Mi servirebbe per una specie di cnc, in modo da archiviare una specie di gcode semplificato, in realtà un csv, sulla sd card invece di riceverlo da processing via seriale.
Per non impiegare ad ogni costo un computer.
Ogni riga conterrebbe delle coordinate e dei comandi, espressi comunque da numeri predefiniti in certi campi.

pablos

#12
Jan 09, 2013, 06:14 pm Last Edit: Jan 09, 2013, 06:19 pm by pablos Reason: 1
ok ho capito, tu cosa hai di già fatto per leggere i char del file da SD?
hai qualcosa o ti manca tutto?

inoltre i dati che devi prelevare ti servono sequenziali o ti servono dei salti all'interno del file?
in caso ti servissero dei salti dovresti far numerare le righe dal programma che genera il file

se mi dai queste info ti faccio un esempio veloce già fatto
no comment

pablos

#13
Jan 09, 2013, 06:47 pm Last Edit: Jan 09, 2013, 06:59 pm by pablos Reason: 1
Dovresti fare una cosa simile se hai già la parte che ti inizializza la sd, controllo errori ecc

Code: [Select]

void read_sd_config()
{
 String ReadLine;
 char charBuf[40];
   
 if(file.open(&root, "file.csv", O_READ))  
 {
  int16_t c;
      while ((c = file.read())>0)
      {
        ReadLine += (char)c;        
          if((char)c=='\n')
          {                
                //--------------------------------------- LETTURA LINEE FILE-------------------------------                          
                Serial.print(ReadLine);//debug                
                //-----------------------------------------------------------------------------------------  
                           
               ReadLine.toCharArray(charBuf, 40);                        
               get_data(charBuf);    
                 ReadLine="";
          }         
      }
  }

   else
   {
      Serial << F("File inesistente o errore SD ");            
   }      
}

void get_data(char *charBuffer)
{  
 int temp_dato[]= {0,0,0,0}; //<<<<< (int) se usi numeri oltre il 255 altrimenti byte
 char *p = charBuffer;  
 byte i = 0;

 while (*p != '\0')
 {
   if (*p == ',') { ++i;  ++p;  continue;} // separatore usa quello che ti pare
   if (isdigit(*p)) //questo controlla che siano solo numeri, se c'e' una lettera o uno spazio vuoto la salta
   {
        temp_dato[i] *= 10;
        temp_dato[i] += (*p - '0');            
   }    
   ++p;
 }  
   
//--------------------test di lettura dell'array verifica se e' corretta la scrittura
 for (byte ii = 0; ii < 4; ii++)
 {
     Serial.println((String)temp_dato[ii]+" ");//debug
 }
//---------------------------------------------------------------------
}


Per leggere l'ultima riga io di solito piazzo un EOF (end of file) alla fine, altrimenti non trova l'ultimo /n
Il char buffer l'ho impostato a 40, se la tua riga supera tale valore aumentalo, ma non esagerare

ciao
no comment

lesto


Dove il numero di caratteri preceduto da "%" è il numero di variabili che ci si aspetta per riga e che vanno a modificare le variaili precedute da "&"?



il carattere che segue il % vuol dire il tipo di dato che vuoi leggere. %d è un intero con segno, %f un float. sono gli stessi identici che usa il printf: Insomma la spataffiata di codice di pablos in realtà esiste già :) http://www.cplusplus.com/reference/cstdio/printf/

Quote
vanno a modificare le variaili precedute da "&"?


esatto, la & commerciale usa l'indirizzo della variabile. Notare che l'array non ha bisogno di & in quanto se usato senza [] allora è già un indirizzo
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up