Autore Topic: replace all e regex  (Letto 590 volte)

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
replace all e regex
« il: 17 Gennaio 2012, 15:55:15 CET »
0
salve, ho un problema con un replace all...
ho provato a fare un replace molto brutale
Codice: [Seleziona]
texts[i] = texts[i].replaceAll(".*", "");ma non fa assolutamente nulla....
a questa conclusione ci sono arrivato dopo aver provato vari replace in quanto ho una riga fatta in questo modo
Codice: [Seleziona]
     ý 01.11.11.10BIBITE ACQUE                                              ýe l'unica parte che mi interessa era bibite acque il resto è da cancellare... quindi avevo provato ad usare inizialmente questo:
Codice: [Seleziona]
                        texts[i] = texts[i].replaceAll(
                                        ".*\\d\\d.\\d\\d.\\d\\d.\\d\\d(.*)   .*",
                                        "$1");

che dovrebbe teoricamente funzionare (è la prima volta che uso le regex sul java quindi non ho idea se sia corretto)
ma cmq a prescindere dalla correttezza dalla regex se non funziona neanche il replaceall di ".*" non credo possa funzionare qualcosa d+ complicato :-P
« Ultima modifica: 17 Gennaio 2012, 16:05:07 CET da Trigun »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:replace all e regex
« Risposta #1 il: 17 Gennaio 2012, 16:03:02 CET »
0
Dovresti spiegare in dettaglio come è fatta la stringa da processare(parti variabili/fisse) e cosa vuoi estrarre da quella stringa.

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:replace all e regex
« Risposta #2 il: 17 Gennaio 2012, 16:03:48 CET »
0
c'e' scritto :-)

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:replace all e regex
« Risposta #3 il: 17 Gennaio 2012, 16:36:59 CET »
0
Postate il LogCat LogCat LogCat LogCat LogCat

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:replace all e regex
« Risposta #4 il: 17 Gennaio 2012, 16:40:36 CET »
0
Le regular expressions in Android funzionano, sono simili a quelle che si usano in Perl, bisogna leggere molto bene la documentazione per utilizzarle:

Pattern | Android Developers

La prima regular expression cancella tutti i caratteri di una stringa, ignoro l'utilità fai prima a mettere un stringa di lunghezza zero.

La seconda è scritta male, prima di tutto per individuare il punto '.' non si mette il punto ma "\\." altrimenti significa qualsiasi carattere, poi metti un numero fisso di spazzi e poi qualsiasi carattere ripetuto zero o più volte. Forse è meglio utilizzare questa regular expression
Codice: [Seleziona]
".*\\d\\d\\.\\d\\d\\.\\d\\d\\.\\d\\d(.*)\\s+.*" se ho capito quello che vuoi fare.
adb logcat | tee /tmp/logcat | grep TAG

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:replace all e regex
« Risposta #5 il: 17 Gennaio 2012, 17:00:05 CET »
0
si in realtà prima c'era anche il \\. che ho tolto tra un test e l'altro cercando di capire quale fosse il problema :-P



praticamente il file è fatto cosi:

Codice: [Seleziona]
     «ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ¡
     ý                                                                      ý
     ý 01.11.11.10BIBITE ACQUE                                              ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ¿
     ý000016.01     0,14PZ    (10,8 %)               PALLET(Colli5025916105211IVA
     ýACQUA FRIZZANTE SANTA CHIARA 1,5L             ¯IC   6  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982000016010ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý000016.05     0,17PZ    (10,5 %)               PALLET(Colli4015849000212IVA
     ýACQUA EFFERV.NATURALE ITALA 1,5L              ¯IC   6  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982000016058ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý001478.01     0,14PZ    (10,8 %)               PALLET(Colli5025916105214IVA
     ýACQUA LEG.FRIZ.SANTA CHIARA 1,5L              ¯IC   6  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982001478015ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý001478.02     0,14PZ    (10,8 %)               PALLET(Colli4025916105217IVA
     ýACQUA NATURALE SANTA CHIARA 1,5L              ¯IC   6  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982001478022ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý017755.01     0,19PZ    (20,7 %)               PALLET(Colli4032118100218IVA
     ýACQUA MINERALE NATURALE SUIO 1,5L              IC   6  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982017755018ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý000016.04     0,19PZ    (11,5 %)               PALLET(Colli4006716000210IVA
     ýACQUA EFFERV.NATURALE CUTOLO 1,5L             ¯IC   6  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982000016041ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý001470.01     0,14PZ    (10,8 %)               PALLET(Colli6023263000216IVA
     ýACQUA NATURALE GUIZZA 2L                       IC   6  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982001470019ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý001470.02     0,17PZ    (06,4 %)               PALLET(Colli4020458000218IVA
     ýACQUA LIEV.FRIZZANTE GUIZZA 2L                 IC   6  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982001470026ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý017649.01     0,12PZ    (09,2 %)               PALLET(Colli6010194001216IVA
     ýACQUA MIN.NATURALE RUGIADA 2L                  IC   6  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982017649010ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý003198.01     1,30PZÖ   (18,06%)               STRATO(Colli8015849000210IVA
     ýACQUA EFFER.NATUR.CUTOLO 12X50CL               IC   1  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982003198010ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý003198.02     1,07PZÖ   (22,94%)               STRATO(Colli8010194001211IVA
     ýACQUA NATURALE RUGIADA 12X50CL                 IC   1  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982003198027ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý003198.03     1,07PZÖ   (22,94%)               STRATO(Colli8010194001219IVA
     ýACQUA LEGG.GASSATA RUGIADA 12X50CL             IC   1  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982003198034ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý                                                                      ý
     ý 01.11.11.20BIBITE BIBITE LT. 1,5                                     ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ¿
     ý001149.01     0,29PZ    (14,4 %)               STRATO(Colli1025916104218IVA
     ýCOLA SPINNER 1,5L                             ¯IC   6  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982001149014ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý001149.02     0,29PZ    (14,4 %)               STRATO(Colli1001620009218IVA
     ýARANCIATA SPINNER 1,5L                        ¯IC   6  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982001149021ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý001149.03     0,29PZ    (14,4 %)               STRATO(Colli1025916104211IVA
     ýGASSOSA SPINNER 1,5L                          ¯IC   6  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982001149038ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý004681.01     0,51PZ    (10,5 %)               STRATO(Colli1025916100212IVA
     ýARANCIATA SPARKLY 1,5L                        ¯IC   6  ó  ó  À  ó  ó  ý
     »ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ  7982004681016ÝÝÝÝÝÝæÝÝæÝÝæÝÝæÝÝæÝÝæÝÝ¿
     ý004681.03     0,40PZ     0,55(11,9 %)                (Colli5025916100219IVA
     ýGASSOSA SPARKLY 1,5L                          ¯IC   6  ó  ó  À  ó  ó  ý
non lo metto tutto perché è 1mb di file :-P cmq sostanzialmente quello che voglio fare è da questo fare riempire un database
i dati sarebbero gli articoli che fanno parte del gruppo (riga 3) quindi sto facendo un parser che mi identifica tutti gli articoli e li associa al gruppo in modo da poterli visualizzare successivamente (ho una expanded list)

quindi praticamente avevo pensato di leggere riga x riga e creare questo database
al momento sono fermo in questo modo
Codice: [Seleziona]
        public void parse(String text) {
                String[] texts;
                texts = text.split("\n");
                String txt = "";
                int i = 0;
                if (texts[i].contains("«")) {
                        i += 2;
                        txt = texts[i].replaceAll(
                                        ".*\\d\\d\\.\\d\\d\\.\\d\\d\\.\\d\\d(.*)   .*",
                                        "$1");
                }

                Toast toast = Toast.makeText(ListinoOrdini.context, txt,
                                Toast.LENGTH_LONG);
                toast.show();
        }

ovviamente il toast è per testare se funziona e al momento non funziona :-)









edit

credo che ci sia un problema di compatibilità di caratteri... dato che mi entra nell'if...

edit2

si credo proprio sia 1 problema di codifica (come si puo' notare nello screen)
però mi sembra strano... le String di java sono utf-16 e sulla funzione del read ho usato
Codice: [Seleziona]
in = new BufferedReader(new InputStreamReader(am.open("db.txt"), "UTF8"));quindi teoricamente dovrebbero esser lette bene le lettere
« Ultima modifica: 17 Gennaio 2012, 17:20:57 CET da Trigun »

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:replace all e regex
« Risposta #6 il: 18 Gennaio 2012, 09:35:35 CET »
0
ho risolto la parte di codifica del file... praticamente prima usava utf8 di default e il problema era proprio quello :-P doveva usare una codifica + ristretta e ho usato la iso-qualcosa (la iso dei caratteri latini)
il problema pero' rimane nella lettura del file che è lentissimo... solo per leggere il file ci vogliono tempi in minuti... c'e' un modo per velocizzare il readline o utilizzare un'altro metodo?

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:replace all e regex
« Risposta #7 il: 18 Gennaio 2012, 09:57:12 CET »
0
Molto probabilmente il file usa una codifica molto usata sotto MS-Windows la ISO-8859-1 non compatibile con la UTF-8 molto usata in ambito web.

Per le ottimizzazione dipende dalla proprie conoscenze di programmazione in Java, bisogna stare molto attenti nel codice nel loop di lettura, bisogna pre-allocare il più possibile gli oggetti, evitare test e oggetti inutili, le regular expression devono essere pre-compilate, ecc...
adb logcat | tee /tmp/logcat | grep TAG

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:replace all e regex
« Risposta #8 il: 18 Gennaio 2012, 10:44:42 CET »
0
Codice: [Seleziona]
                AssetManager am = ListinoOrdini.context.getResources().getAssets();
                try {
                        in = new BufferedReader(new InputStreamReader(am.open("db.txt"),"ISO-8859-1"));
                        String line;
                        String db = ""; 

                        while ((line = in.readLine()) != null){
                                db += line + "\n";
                        }

non mi pare sia molto complicato come codice :-) ok posso saltare un passaggio analizzando i dati direttamente nella lettura del file... però se è gia lento in questo modo non migliorerei molto :-)

il file che deve leggere è molto grande

Totale parole   91.046
Totale righe   11.926
Totale caratteri   947.889
Lunghezza massima righe   84
   
Dimensione file   947.889 B   (925,67 kB)
   
Ora di creazione   16/01/2012 20:37:09
Ultima modifica   16/01/2012 20:37:09


potrei in parte alleggerire il device parsando il file sul pc e una volta parsato trasformarlo in un csv standard ... ma apparte che vorrei evitare di dover elaborare ogni volta il file al computer il file rimarrebbe lo stesso molto grosso... su 11k di righe dovrebbero essere circa 3k di insert sul db...
se elaborassi il file al pc che credo sia + veloce mi potrebbe dare un file da 3k linee ... ma in ogni caso sarebbe lo stesso molto lento l'inserimento
« Ultima modifica: 18 Gennaio 2012, 10:55:44 CET da Trigun »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:replace all e regex
« Risposta #9 il: 18 Gennaio 2012, 11:02:43 CET »
0
Usa un oggetto StringBuilder invece di concatenare le stringhe con l'operatore +.

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:replace all e regex
« Risposta #10 il: 18 Gennaio 2012, 11:11:31 CET »
0
grazie mille... era proprio quello il problema :-P in effetti ripensandoci ora la concatenazione con il + è pesante ... pero' non ci avrei mai pensato in autonomia :-)

credevo che il problema fosse proprio nella lettura del file e non nella scrittura sulla variabile :-)

automaticamente ho risolto anche il problema di regex ovviamente :-P che ha sempre funzionato ...