Autore Topic: problema con lettura file  (Letto 1224 volte)

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
problema con lettura file
« il: 02 Marzo 2012, 18:03:35 CET »
0
ho un problema...
ho 2 file "quasi identici"
però non capisco perchè il codice su 1 file funziona e su l'altro invece da cose senza senso....

o meglio se li apro con il blocco note i file sono gli stessi...
se invece li leggo da java mi vengono stampate stringhe vuote che in realtà non esistono o cose del genere...

ho notato che a quasi parità di testo (1285 vs 1336 righe) il primo file è di 90 kb il 2° di 200kb...
e ovviamente i 100kb non sono nelle righe in +... ma a questo punto sono proprio nelle righe che io non vedo da blocconote....
perchè ci sono? come faccio a ignorarle come le ignora il blocco note?

per leggere il file uso un semplice
Codice (Java): [Seleziona]
                        in = new BufferedReader(new InputStreamReader(
                                        new FileInputStream(f), "ISO-8859-1"));

cioè se il blocco note mi apre il file tranquillamente ... perchè java vede cose diverse?

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Re:problema con lettura file
« Risposta #1 il: 04 Marzo 2012, 02:58:26 CET »
0
Aprili con un editor esadecimale per verificare l'effettivo contenuto(pspad è gratis ed ha l'editor esadecimale) . Non conosco il comportamento di blocco note ma presumo non mostri i caratteri non stampabili anche se credo che spostandosi con le freccette dovrebbe portarti all'effettiva fine del file indipendentemente dalla visualizzazione
Odio l'inglese e per un informatico non è il massimo

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
R: Re:problema con lettura file
« Risposta #2 il: 04 Marzo 2012, 03:15:30 CET »
0
Aprili con un editor esadecimale per verificare l'effettivo contenuto(pspad è gratis ed ha l'editor esadecimale) . Non conosco il comportamento di blocco note ma presumo non mostri i caratteri non stampabili anche se credo che spostandosi con le freccette dovrebbe portarti all'effettiva fine del file indipendentemente dalla visualizzazione
Uso pspad...
Se vuoi allego anche il file....
Ora cmq controllo in exa

Inviato dal mio GT-I9100 usando Tapatalk

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:problema con lettura file
« Risposta #3 il: 04 Marzo 2012, 03:20:47 CET »
0
in effetti in hex è diverso...
come si può vedere dall'allegato... c'e' uno 00 ad ogni carattere... come posso risolvere?
è come se ci fosse una codifica a 4 byte al posto di 2 byte...
« Ultima modifica: 04 Marzo 2012, 03:22:48 CET da Trigun »

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Re:problema con lettura file
« Risposta #4 il: 04 Marzo 2012, 03:51:12 CET »
0
Sembrerebbe che chi genera il file sia passato da ascii ad unicode e quindi c'è un byte in più. Magari è il prodotto di una vecchia applicazione quello 'giusto' e di una versione più recente quello 'sbagliato'. Prova a leggere utilizzando la read  del BufferedReader (che legge un intero su due byte) e poi fai un cast a carattere. In teoria dovrebbe andare bene.
Odio l'inglese e per un informatico non è il massimo

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:problema con lettura file
« Risposta #5 il: 04 Marzo 2012, 03:53:11 CET »
0
il giusto è più vecchio di quello sbagliato...

non ho capito la storia del cast ecc ecc :-) potresti farmi 1 esempio? :-)
e facendo come hai detto funzionerebbe in entrambi i casi?

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Re:problema con lettura file
« Risposta #6 il: 04 Marzo 2012, 04:10:22 CET »
0
Infatti il 'giusto' è più vecchio perché usa ascii; il nuovo, cioè quello sbagliato, usa unicode.
Codice (Java): [Seleziona]
char c=(char) file.read();Leggi un intero e lo trasformi in carattere. 
Probabilmente ottieni lo stesso e continui ad usare il readLine se metti nella codifica di apertura del file  "UTF-16"
per il nuovo.  Avendo codifiche diverse devi per forza differenziare: sul vecchio "ISO-8859-1" e sul nuovo "UTF-16".
Odio l'inglese e per un informatico non è il massimo

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
R: problema con lettura file
« Risposta #7 il: 04 Marzo 2012, 04:19:37 CET »
0
Quindi non ho modo di far funzionare sia un file che l'altro? Perché il file non lo genero io... Quindi non posso sapere in che modo me lo hanno fatto... Se usassi utf-16 e poi tornassero all'altra codifica mi si imputtanerebbe il database di nuovo... (leggo questo file per poi passarlo a diverse stringhe regex e salvarlo sul db)

Inviato dal mio GT-I9100 usando Tapatalk

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Re:problema con lettura file
« Risposta #8 il: 04 Marzo 2012, 10:46:40 CET »
+1
Potresti fare una cosa del genere:
Apri il file con InputStreamReader che mette a disposizione un metodo getEncoding che restituisce la stringa di codifica e sulla base della stringa apri come ti serve. In alternativa leggi i primi due byte del file (o comunque in una posizione significativa dove sai esservi caratteri) per decidere la codifica con cui riaprirlo per la lettura:
Codice (Java): [Seleziona]
//leggi  due byte
int value=file.read();
//prelevi il byte alto
value=value & 0xFF00;
//se è zero è codifica unicode altrimenti ascii
if (value==0){
//apri con UTF
}else{
//apri con ISO
}
Odio l'inglese e per un informatico non è il massimo

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:problema con lettura file
« Risposta #9 il: 04 Marzo 2012, 14:14:03 CET »
0
la funzione getencoding non funziona..
perchè con il vecchio file mi dice che e' sempre UTF-8 ...
quindi dovrò fare una cosa manuale...
e credo che la cosa manuale funzioni :-)

ho fatto così:
Codice (Java): [Seleziona]
                        FileInputStream fis = new FileInputStream(f);
                        int b1, b2, b3;
                        b1 = fis.read();
                        b2 = fis.read();
                        fis.read();
                        b3 = fis.read();
                        if (b1 == 255 && b2 == 254 && b3 == 0) {
                                in = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
                        } else {
                                in = new BufferedReader(
                                                new InputStreamReader(fis, "ISO-8859-1"));
                        }

l'utf-8 funziona ma poi non mi funziona + la lettura del file perchè non mi riconosce le lettere -.-
ora mi riguardo la tabella ascii e cerco una codifica che possa funzionare....
devo solo ritrovare la tabella che avevo trovato una volta :-)
in cui c'era la tabella completa e mostrava ogni codifica fino a dove arrivava




trovata ! : Unicode Table
santa cronologia :-)


peccato che non esista nessuna codifica che funzioni con il file mio.... praticamente il file è anche traslato ... poichè dall'HEX si vede ad es che i caratteri sono DD00 mentre per far funzionare tutto dovrebbe essere 00DD...

praticamente se cancellassi i primi 2 byte avrei i quartetti dell'hex messi apposto ...
solo che come faccio a farlo ? :-)
« Ultima modifica: 04 Marzo 2012, 14:53:07 CET da Trigun »

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:problema con lettura file
« Risposta #10 il: 04 Marzo 2012, 15:07:25 CET »
0
emm riuscito... era + facile di quello che credessi :-) bastava mettere un'altro read() prima di darlo in pasto all'inputreader :-P
quindi così

Codice (Java): [Seleziona]
                        FileInputStream fis = new FileInputStream(f);
                        int b1, b2, b3;
                        b1 = fis.read();
                        b2 = fis.read();
                        fis.read();
                        b3 = fis.read();
                        fis.read();
                        if (b1 == 255 && b2 == 254 && b3 == 0) {
                                in = new BufferedReader(new InputStreamReader(fis, "UTF-16"));
                        } else {
                                in = new BufferedReader(
                                                new InputStreamReader(fis, "ISO-8859-1"));
                        }