Autore Topic: Parser file di testo  (Letto 224 volte)

Offline array81

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
    • MartinZone
  • Dispositivo Android:
    OnePlus One, Nexus S
  • Play Store ID:
    MartinZone
  • Sistema operativo:
    Windows 7
Parser file di testo
« il: 25 Settembre 2014, 15:20:45 CEST »
0
Mi trovo a dover leggere un file di testo che può contenere numerose righe (diciamo da 10000 a 50000 righe).
Ogni riga di testo contiene una serie di informazioni del tipo:
- dato A: da carattere 1 a carattere 5;
- dato B: da carattere 6 a carattere 8;
- dato C: da carattere 9 a carattere 13;
- dato D: da carattere 14 a carattere 32;
e via dicendo.

Ovviamente le posizione sono sempre le stesse, ad esempio il dato A é contenuto sempre tra il carattere 1 e il carattere 5, tuttavia non é detto che prenda tutti i caratteri tra la posizione 1 e 5 ed in tal caso ci saranno degli spazi vuoti.
Ad esempio se il dato A fosse il numero 150 nel file di testo si leggerà "  150" ovvero dei 5 caratteri i primi 2 saranno degli spazi.

Io ho la necessità di estrarre tutti questi dati e copiarli all'interno di un database.
Il mio codice funziona ma risulta molto lento, sopratutto su terminali datati. In sostanza per tutte le righe dal file vado a richiamare più volte il seguente codice:

Codice (Java): [Seleziona]
tag5 = currentline.substring(13, 17);
tag5 = tag5.replaceAll("\\s","");

Mi chiedevo se esiste un modo più veloce per farlo.

Grazie.

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Parser file di testo
« Risposta #1 il: 25 Settembre 2014, 16:20:25 CEST »
0
Una strada che puoi seguire è ricorrere ad una classe Pattern statica:

Codice (Java): [Seleziona]
public static Pattern removeSpaces = Pattern.compile("\\s");
da usare in questo modo:

Codice (Java): [Seleziona]
tag5 = removeSpaces.matcher(currentline.substring(13, 17)).replaceAll("");
così è sicuramente più veloce, perché quando scrivi replaceAll("\\s","") java "ricompila" ogni volta l'espressione regolare, usando Pattern la compila internamente una volta sola e si limita ad applicarla.

Sospetto che quest'approccio sia internamente usato per implementare il trim() sulla stringa, potresti provare a vedere se ottieni gli stessi tempi anche ricorrendo ad un banale

Codice (Java): [Seleziona]
tag5 = currentline.substring(13, 17).trim();

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Parser file di testo
« Risposta #2 il: 25 Settembre 2014, 16:46:47 CEST »
0
Se maneggi i dati di testo usando oggetti String, è normale che sia lento. La String è un oggetto "immutable", vuol dire che ogni volta che cambi il suo contenuto, viene creato un nuovo oggetto String col contenuto modificato (perchè quello esistente non può essere cambiato). Creare oggetti continuamente è incredibilmente inefficiente.

Prova a riscrivere il tuo codice usando StringBuilder (che non è immutable e che è fatto apposta per maneggiare stringhe in modo efficiente).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline array81

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
    • MartinZone
  • Dispositivo Android:
    OnePlus One, Nexus S
  • Play Store ID:
    MartinZone
  • Sistema operativo:
    Windows 7
Re:Parser file di testo
« Risposta #3 il: 25 Settembre 2014, 17:56:14 CEST »
0
Stasera vedo di leggere qualcosa su StringBuilder e di iniziare a modificare il codice.

Grazie del suggerimento.