Autore Topic: Lettura di una stringa Csv, e gestione eventi in base a quello che viene letto.  (Letto 1939 volte)

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Ciao a tutti..
Sto realizzando la mia seconda applicazione per Android con Eclipse, per gestire un paio di prese e luci nella mia stanza con arduino (un microcontrollore)
Ho gia scritto per questo un app funzionante con appinventor, ma vorrei qualcosa di più, anche per imparare a usare meglio eclipse.

L'idea di base è quella di usare il microcontrollore per accendere e spegnere le luci attraverso delle richieste GET, e il microcontrollore risponde stampando una stringa CSV, che rappresenta lo stato di ogni presa e luce..

Ad esempio questa è la stringa:
Codice: [Seleziona]
ON,OFF,OFF,ON,OFF
Con appinventor era semplice creare una lista dalla stringa CSV e definire ad esempio che se il primo elemento  della lista era ON allora lo stato della della luce associata al primo elemento era ON, se il secondo elemento  della lista era OFF allora lo stato della della luce associata al secondo elemento era OFF e così via.

La mia domanda è:  Come si può fare il parsing di una stringa csv con eclipse, in modo tale da leggere lo stato della stringa, e in Base se è ON o OFF cambiare lo stato anche del ToggleButton Associato?

Suggerimenti?

Io per ora sono riuscito a fare funzionare solo il togglebutton attraverso delle richieste Get ad arduino e a ricevere la risposta sotto in una texview.
Ecco come appare

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Lettura di una stringa Csv, e gestione eventi in base a quello che viene letto.
« Risposta #1 il: 06 Dicembre 2011, 10:34:01 CET »
+1
Ciao,
guarda questo snippet che avevo inserito ai tempi.

http://www.anddev.it/index.php/topic,4594.msg28065.html#msg28065

C'è l'esempio di come fare un parse di un file csv
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Lettura di una stringa Csv, e gestione eventi in base a quello che viene letto.
« Risposta #2 il: 06 Dicembre 2011, 11:11:48 CET »
0
Grazie,mi tornerà sicuramente utile... Devo solo capire come leggere la stringa generata su una pagina html di un sito e non da un file presente in Sd..  :D
Altrimenti  invece di generare una stringa direttamente sulla pagina, dovrò fare in modo di creare un file csv ogni volta che varia lo stato di una presa o di una luce....
Ci lavorerò un po su, cercando di venirne a capo. :)

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Lettura di una stringa Csv, e gestione eventi in base a quello che viene letto.
« Risposta #3 il: 06 Dicembre 2011, 14:22:00 CET »
0
ok.. ho fatto un po di prove, prima di tutto  ho provato con il codice che hai postato tu e funziona benissimo ala lettura da sd, quindi ho provato ad adattare il codice per leggere da web invece che da sd.

Quindi ho pensato di fare stampare al micorcontrollore un file csv usando
Codice: [Seleziona]
client.println("Content-Type: text/csv");
E poi ho adattato il tutto così:

Codice (Java): [Seleziona]
[code]
public class LettoreCsvActivity extends Activity {

        // Dichiarazione oggetti
        TextView statoPresaPc;
        TextView statoPresaTv;
        TextView statoLuceCamera;
        TextView statoLucePc;
        TextView statoLuceScrivania;
        TextView txtNumeroRiga;
        Button btnImport;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                Log.i("importStato", "BEGIN");
                setContentView(R.layout.main); //Carico layout
               
                                // Inizializzo gli  oggetti
                statoPresaPc = (TextView) findViewById(R.id.presa_pc);
                statoPresaTv = (TextView) findViewById(R.id.presa_tv);
                statoLuceCamera = (TextView) findViewById(R.id.luce_camera);
                statoLucePc = (TextView) findViewById(R.id.luce_pc);
                statoLuceScrivania = (TextView) findViewById(R.id.luce_scrivania);
                txtNumeroRiga = (TextView) findViewById(R.id.txtNumeroRiga);
                btnImport = (Button) findViewById(R.id.btnImport);

                                //Dichiaro l'evento del button
                btnImport.setOnClickListener(new OnClickListener()
                                 {

                        public void onClick(View v) {
                                // TODO Auto-generated method stub
                                Log.i("IMPORT", "BEGIN");

                                                                //Richiamo il metodo che esegue il parse
                                startImport();
                                Log.i("IMPORT", "END");
                        }
                });
        }

        // Metodo parse file
        public void startImport()
        {
            //Inizio
            int cont=0; //contatore delle righe processate
            String[] separated; //Array che conterra ogni singolo elemento di ogni linea del file
                try {
                        HttpClient httpclient = new DefaultHttpClient();
                                URI getURL = new URI("http://miaURL");
                                Log.i("IMPORT",getURL.getQuery());
                                HttpGet get = new HttpGet(getURL);
                                HttpResponse responseGet = httpclient.execute(get);  
                                HttpEntity resEntityGet = responseGet.getEntity();  
                                        String s = EntityUtils.toString(resEntityGet);
                                        BufferedReader br = new BufferedReader(new FileReader(s));
                    String line; //variabile che conterrà la singola linea

                                            //Inizio ciclo di lettura fino alla fine del file
                    while ((line = br.readLine()) != null)
                    {
                            cont++;
                            separated = line.split(","); //Effettuo lo split della singola linea nell'array

                                                            //Memorizzo ogni singolo elemento negli oggetti della view
                            statoPresaPc.setText(separated[0]);
                            statoPresaTv.setText(separated[1]);
                            statoLuceCamera.setText(separated[2]);
                            statoLucePc.setText(separated[3]);
                            statoLuceScrivania.setText(separated[4]);
                            txtNumeroRiga.setText(String.valueOf(cont));//QUi ho dovuto castare il contatore per la                                                               visualizzazione                                        delle righe importata
                            Log.i("IMPORT", "5");
                    }
                }
                        catch(Exception e){
            {
                Toast.makeText(LettoreCsvActivity.this,
                                                "errore",
                                                Toast.LENGTH_LONG).show();
            }
         }
        }
}

Non mi entra nel Try, passa direttamente all'eccezione che mi ritorna il messaggio d' errore...

Secondo voi che cosa sbaglio??

A me non mi quadra tanto questo pezzo:
Codice: [Seleziona]
String s = EntityUtils.toString(resEntityGet); //qui dovrei memorizzare in una stringa i valori separati dalle virgole
BufferedReader br = new BufferedReader(new FileReader(s)); // ma qui dovrei passare il file e non una stringa, Giusto?

Mi sono un po bloccato, sono alle prime armi come potete notare :)
Grazie per i suggerimenti
« Ultima modifica: 06 Dicembre 2011, 17:13:07 CET da dr4gone »

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Lettura di una stringa Csv, e gestione eventi in base a quello che viene letto.
« Risposta #4 il: 06 Dicembre 2011, 14:32:04 CET »
0
Posta il logcat dell'errore
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Lettura di una stringa Csv, e gestione eventi in base a quello che viene letto.
« Risposta #5 il: 06 Dicembre 2011, 15:20:11 CET »
0
scusa mi sono spiegato male.. il logcat è pulito. non ci sono errori..

Intendevo dopo la pressione del tasto " Start importazione" che mi ritorna un Toast errore che ho definito io  nel catch
Quindi  non funziona qualcosa nel try, giusto?
Codice: [Seleziona]
catch(Exception e){
            {
                Toast.makeText(LettoreCsvActivity.this,
                                                "errore",
                                                Toast.LENGTH_LONG).show();
            }

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Lettura di una stringa Csv, e gestione eventi in base a quello che viene letto.
« Risposta #6 il: 06 Dicembre 2011, 15:21:43 CET »
0
Ti consiglio di mettere dei log ad ogni passo del codice e poi guardare il logcat.
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Lettura di una stringa Csv, e gestione eventi in base a quello che viene letto.
« Risposta #7 il: 06 Dicembre 2011, 15:47:43 CET »
0
ecco il logcat:

Codice: [Seleziona]
12-06 14:28:06.736: I/AndroidRuntime(839): NOTE: attach of thread 'Binder Thread #3' failed
12-06 14:28:07.005: I/importStato(847): BEGIN
12-06 14:28:07.395: I/ActivityManager(62): Displayed com.brunolagana/.LettoreCsvActivity: +768ms
12-06 14:28:12.545: D/dalvikvm(143): GC_EXPLICIT freed 155K, 52% free 2855K/5895K, external 1216K/1559K, paused 78ms
12-06 14:28:17.605: D/dalvikvm(236): GC_EXPLICIT freed 10K, 54% free 2597K/5639K, external 410K/517K, paused 92ms
12-06 14:28:22.595: D/dalvikvm(248): GC_EXPLICIT freed 6K, 54% free 2544K/5511K, external 410K/517K, paused 64ms
12-06 14:28:27.645: D/dalvikvm(316): GC_EXPLICIT freed 4K, 54% free 2538K/5511K, external 410K/517K, paused 74ms
12-06 14:29:16.775: I/IMPORT(847): BEGIN
12-06 14:29:16.805: I/IMPORT(847): END

Alla pressione del tasto nel logcat  compaiono
12-06 14:29:16.775: I/IMPORT(847): BEGIN
12-06 14:29:16.805: I/IMPORT(847): END

e su schermo il toast che ho immesso io nel catch, quindi non va bene qualcosa di quello che ho scitto nel try.... non mi da nemmeno il LOG che ho messo per vedere che risposta da la GET...
Come se non entrasse prorpio nel try.... mmmmmm


Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Lettura di una stringa Csv, e gestione eventi in base a quello che viene letto.
« Risposta #8 il: 06 Dicembre 2011, 16:06:00 CET »
0
Ti ripeto, l'unico modo che hai per beccare il problema , devi seminare log dalla prima linea della try in poi ogni singola riga.
Poi guarda il logcat.
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Lettura di una stringa Csv, e gestione eventi in base a quello che viene letto.
« Risposta #9 il: 06 Dicembre 2011, 16:26:20 CET »
0
Ok. Grazie della pazienza.
Ci proverò tra stasera e domani.
Ti farò sapere.
Grazie Ancora

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Lettura di una stringa Csv, e gestione eventi in base a quello che viene letto.
« Risposta #10 il: 06 Dicembre 2011, 19:37:49 CET »
0
OK! HO RISOLTO!
I problemi riscontrati erano 2.
Il primo era dovuto alla mia inesperienza, e al fatto che si doveva definire nell'android manifest il permesso per usare internet (per leggere da sd non ce n'era bisogno)
Il secondo era principalmente la generazione del file CSV da parte del microcontrollore.
Quello che generava e che non leggeva era questo:
Codice: [Seleziona]
ON,OFF,ON,OFF,OFFPoichè tagliava la prima riga in automatico.
Quello che si doveva  fare è usare una formattazione del genere
Codice: [Seleziona]
PresaTv,PresaPc,LuceCamera,LuceScrivania,LucePc
ON,OFF,ON,OFF,OFF

A chi interessasse ho modificato leggermente il codice presente qui http://java2s.com/Open-Source/Java-Document-2/Ruby/chirico/dev/cwxstat/com/YahooFinance.java.htm  per fare il parsing di un file.csv su un sito esterno o su un server invece che da sd oltre a prendere spunto dal link messo prima da Luigi Arena, che ringrazio.

Eccolo

Codice (Java): [Seleziona]
 btnImport.setOnClickListener(new OnClickListener()
       {
          public void onClick(View v) {
          Log.i("StatoFunzione", "INIZIO");
          getStato();
          Log.i("StatoFuzione", "FINE");
                        }

public void getStato() {
        try {
                  final URL url = new URL("[url]http://la tua url");
                  final BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
                  reader.readLine();
                  final String line = reader.readLine();
                  System.out.println("Riga letta: " + line);
                  final String[] separated = line.split(",");
//Memorizzo ogni singolo elemento negli oggetti della view
                  statoPresaPc.setText(separated[0]);
                  statoPresaTv.setText(separated[1]);
                  statoLuceCamera.setText(separated[2]);
                  statoLucePc.setText(separated[3]);
                  statoLuceScrivania.setText(separated[4]);
                                }
                        catch (Exception e) {
                                 Toast.makeText(LettoreCsvActivity.this,"Errore nel contattare il server",Toast.LENGTH_LONG).show();
                                }
                            }

                });
« Ultima modifica: 06 Dicembre 2011, 19:49:13 CET da dr4gone »