Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: Lettura file

3 views
Skip to first unread message
Message has been deleted
Message has been deleted
Message has been deleted

Gian Uberto Lauri

unread,
Feb 27, 2007, 3:00:46 AM2/27/07
to
>>>>> "A" == Angela <angy...@tiscali.it> writes:

A> do {
A> track.readLine();
A> StringTokenizer string =new StringTokenizer(track.readLine());
A> num1.add(idx, Double.parseDouble(string.nextToken()));
A> num2.add(idx, Double.parseDouble(string.nextToken()));
A> num3.add(idx, Double.parseDouble(string.nextToken()));
A> num4.add(idx, Double.parseDouble(string.nextToken()));
A> idx++;
A> } while (track.readLine() != null);

Leggi 3 righe a ciclo, e` giusto ?

E perché usi uno StringTokenizer e non il metodo split di String ?

Un paio di righe dell'input non farebbero male...

--
/\ ___
/___/\_|_|\_|__|___Gian Uberto Lauri_____
//--\| | \| | Integralista GNUslamico
\/ e coltivatore diretto di Software

Message has been deleted

Jack

unread,
Feb 27, 2007, 3:50:33 AM2/27/07
to
On 27 Feb, 09:00, Gian Uberto Lauri <s...@spammer.impiccati.it> wrote:

> >>>>> "A" == Angela <angyc...@tiscali.it> writes:
>
> A> do {
> A> track.readLine();
> A> StringTokenizer string =new StringTokenizer(track.readLine());
> A> num1.add(idx, Double.parseDouble(string.nextToken()));
> A> num2.add(idx, Double.parseDouble(string.nextToken()));
> A> num3.add(idx, Double.parseDouble(string.nextToken()));
> A> num4.add(idx, Double.parseDouble(string.nextToken()));
> A> idx++;
> A> } while (track.readLine() != null);
>
> Leggi 3 righe a ciclo, e` giusto ?
>
> E perché usi uno StringTokenizer e non il metodo split di String ?

a parte questo, il suo problema e' qui:

StringTokenizer string =new StringTokenizer(track.readLine());

perche' ha problemi ad inizializzare il tokenizer:

java.lang.NullPointerException
at java.util.StringTokenizer.<init>(Unknown Source)

cito (dalle API):
<cite>
StringTokenizer

public StringTokenizer(String str)

Constructs a string tokenizer for the specified string. The
tokenizer uses the default delimiter set, which is " \t\n\r\f": the
space character, the tab character, the newline character, the
carriage-return character, and the form-feed character. Delimiter
characters themselves will not be treated as tokens.

Parameters:
str - a string to be parsed.
Throws:
NullPointerException - if str is null
<\cite>

quindi il problema e' che track.readLine() non ritorna una stringa
come vorrebbe il Tokenizer (credo).

Angela, sei sicura che track.ReadLine() legga qualcosa? prova a fare
un System.out.println(track.readLine()); tanto per vedere se legge
giusto.
Poi al Tokenizer (se non vuoi usare .split()) io passerei i token di
separazione dei campi (spazio,tab,ecc.) e non un alinea letta dal
file.

Ciao Jack


Message has been deleted

Gian Uberto Lauri

unread,
Feb 27, 2007, 4:47:33 AM2/27/07
to
>>>>> "A" == Angela <angy...@tiscali.it> writes:

A> Num1 Num2 Num3 Num4 Num5 Num6 Num7 Num8 Num9 Num10 Num11 Num12
A> Num13 Num14 Num15 Num16 Num17 Num18 Num19 Num20 stato 0.00000E+00
A> 1.468 3.752 2.664 8.070 4.299 0.925 5.55E-2 2.43E-3 0.2561 0.8681
A> 1.147 0.8575 0.9287 1.187 0.0000 0.0982 0.000 -1.930 0.0000 a= 0.55
A> b=0.019 c=0.2 1.67857E+06 1.494 3.738 2.584 8.071 4.303 0.900
A> 7.96E-2 3.55E-3 0.2650 0.8789 1.162 0.8575 0.9221 1.228 0.0000
A> 0.0982 0.000 -1.904 0.0000 7.29263E+06 1.514 3.732 2.539 8.074
A> 4.299 0.839 1.35E-1 7.97E-3 0.2825 0.8845 1.186 0.8575 0.8938 1.244
A> 0.0000 0.1063 0.000 -1.884 0.0000 Te-m

A> per chiarire un pò questo input, a me non servirà mai la colonna
A> stato (che nel primo rigo ha come valori a= 0.55 b=0.019 c=0.29 e
A> nel terzo Te-m). Magari per vederlo meglio conviene fare il copia
A> incolla usando wordpad.

A> Cmq la mia idea era la seguente: leggere la prima riga e scartarla,
A> dalla seconda in poi leggere la riga, salvare i primi 4 double e
A> saltare alla riga successiva, questo finchè non finisce il file. Il

Mi sa che hai sbagliato il loop tanto per cominciare, A-chan.

A> do {
// Questa dovresti eseguirla una sola volta, non ogni ciclo
A> track.readLine();
// questa potrebbe andare bene


A> StringTokenizer string =new StringTokenizer(track.readLine());
A> num1.add(idx, Double.parseDouble(string.nextToken()));
A> num2.add(idx, Double.parseDouble(string.nextToken()));
A> num3.add(idx, Double.parseDouble(string.nextToken()));
A> num4.add(idx, Double.parseDouble(string.nextToken()));
A> idx++;

//Ma questa butta via una riga....


A> } while (track.readLine() != null);

Jack aveva colpito bene che fosse la creazione dello StringTokenizer,
ma il problema sorge da come è fatto il loop.

Supponiamo che l'input sia

Num1 Num2 Num3 Num4 Num5
0.00000E+00 1.468 3.752 2.664 8.070
1.67857E+06 1.494 3.738 2.584 8.071
7.29263E+06 1.514 3.732 2.539 8.074

Il tuo codice scarta Num1... Num5, crea il tokenizer con la riga 1,
scarta la riga 2 (test nel while), scarta la 3 e prova a creare un
tokenizer con un input nullo... Kaboooooom!

Per il resto, purtroppo ora come ora non ho molto tempo per i test...

Gian Uberto Lauri

unread,
Feb 27, 2007, 5:09:12 AM2/27/07
to
>>>>> "A" == Angela <angy...@tiscali.it> writes:

A> for (int i = 0; i < n; i++) {
A> track.nextLine();
A> String checkline=track.nextLine();
}
Angela,
cosa ti hanno fatto di male le righe pari del file di input :) ?

Jack

unread,
Feb 27, 2007, 5:13:25 AM2/27/07
to
On 27 Feb, 10:43, "Angela" <angyc...@tiscali.it> wrote:
> Ho provato un'alternativa a tokenizer usando di nuovo la classe
> scanner, ma il problema è più o meno simile a prima...
> Vi posto il codice:
>
> public class ReadTrack {
>
> private Double[] num1, num2, num3, num4;
>
> public ReadTrack(String stringfile) {
> try {
> // riceve in ingresso il nome del file e lo legge
> // prova per contare il numero di righe
> LineNumberReader lnr = new LineNumberReader(new BufferedReader(
> new FileReader(stringfile)));
> int total = 0;
> while (lnr.readLine() != null) {
> total++;
> }
> int n = total - 1;
> num1 = new Double[n];
> num2 = new Double[n];
> num3 = new Double[n];
> num4 = new Double[n];
>
> // prova con la classe scanner
> Scanner track = new Scanner(new File(stringfile));
>
> track.nextLine();

> for (int i = 0; i < n; i++) {
> track.nextLine();
> String checkline=track.nextLine();
> Scanner line=new Scanner(checkline);
> num1[i] = line.nextDouble();
> num2[i] = line.nextDouble();
> num3[i] = line.nextDouble();
> num4i] = line.nextDouble();
> }
>
> } catch (Exception e) {
> e.printStackTrace();
> }
> }
>
> public Double[] getNum1() {
> return num1;
> }
>
> public Double[] getNum2() {
> return num2;
> }
>
> public Double[] getNum3() {
> return num3;
> }
>
> public Double[] getNum4() {
> return num4;
> }
>
> Stavolta invece di numeri sballati mi spuntano solo tanti null e
> questo errore:
>
> java.util.InputMismatchException
> at java.util.Scanner.throwFor(Unknown Source)
> at java.util.Scanner.next(Unknown Source)
> at java.util.Scanner.nextDouble(Unknown Source)
> at ReadTrack.<init>(ReadTrack.java:45)
> at Main(main.java:114)
>
> Se provo a fare System.out.println(track.nextLine()); me la scrive
> bene, mentre prima non lo faceva...
> Qualche altro suggerimento?

Si dopo aver aperto e usato il file con il LineBufferedReader e prima
di usare lo Scanner devi chiudere il file, altrimenti lo Scanner lo
vede gia' a perto da qualcos'altro e non sa cosa fare.

Message has been deleted

Gian Uberto Lauri

unread,
Feb 27, 2007, 5:48:18 AM2/27/07
to
>>>>> "A" == Angela <angy...@tiscali.it> writes:

A> GianUberto...finalmente ho capito(forse!):

Direi di si, il loop mi pareva corretto.

Ah, la documentazione dice che l'eccezzione che ti becchi viene
sollevata se il numero non rispetta l'espressione regolare per numeri
floating point o è fuori range.

Message has been deleted
0 new messages