Scannen Zahlen von Datei

Status
Nicht offen für weitere Antworten.

klein-odd

Aktives Mitglied
Hallo zusammen !


Es wird Datei data.txt gelesen und der Scanner soll alle
Doubles (bzw. Floats ) finden und als Zahlen ausgeben.

Es geht nach folgendem Muster :

Code:
FileReader file = new FileReader("data.txt");
Scanner sc = new Scanner(file);

while(sc.hasNext())
{
    if(sc.hasNextDouble())
    d = sc.nextDouble();
    System.outprintln("double" +d );
}

Warum wird nur jede zweite Zahl als Double erkannt ?
in jeder Zeile der gelesenen Datei gibt es zwei Zahlen

zahl1 zahl2
zahl1 zahl2
zahl1 zahl2
zahl1 zahl2
...

Beide Zahlen sind Gleitkommazahlen
und nur immer die erste wird als Zahl erkannt (hasNextDouble, hasNextFloat).
Hängt es damit zusammen,
dass die zweiten Zahlen kleiner als 1 sind und mit einer 0 beginnen ?

So sieht es jedenfalls in der Konsole aus.

Liegt es am Scanner oder an Double oder ... ?
 
..nein, es liegt an Deiner Schleife! 😉
Du sagst ja 'Solange der Scanner eine Zeile hat' !
Nun und im Schleifenrumpf liest Du genau immer nur den ersten Wert der Zeile aus!

Ergo, Dein Programm macht was Du geschrieben hast! *fg* *morphy lässt grüssen*

mfg
DocRandom
 
gut, aber :

erstens :

Scanner.hasNext();

ist WAHR, wenn der Scanner vor dem nächsten Token steht

(Java-Referenz) Returns true if this scanner has another token in its input.

Und eine Zeile kann mehrere Tokens beinhalten, z.B. Zahl1 und Zahl 2

zweitens :

zwei erste Zahlen (die erste Zeile) sind 0.0 und 0.0 -
die werden gleich als Strings eingelesen,
nicht mal eine wird als Double oder als Float erkannt.

Das Harte dabei ist, dass es kopiert von "Klassikern" ist.
Ich habe nichts Konkurrentes zum Vergleich.

Hat's jemand ?
Kann's jemand
 
Hi,

habs gerade mal getestet und bin auch auf Probleme gestossen. Hab dann in meiner angelegten "data.txt" mal alle Punkte durch Kommas ersetzt (also 0,0 statt 0.0 und zB 1,3 und -4,52), dann hat er mir das korrekt eingelesen. Find ich selber auch etwas seltsam...
Falls du keinen Einfluss auf die "data.txt" hast, kannst du ja die "String.replace('.', ',')" Methode benutzen, um alle Punkte in Kommas zu verwandeln.

Grüße
 
bisher hast du ja noch gar keine Beispiele für die Zahlen gegeben,
mit Datei ist sowas auch schwer zu beurteilen,

kannst du das mal in einen String kopieren
"zahl1 zahl2 \n zahl1 zahl2 \n zahl1 zahl2"
?
tritt dann das Problem immer noch auf?


edit: etwas spät vielleicht 😉
 
Die Daten Datei sieht genau so aus :

0. 0.
2.553 0.093040134
3.343 0.233108353
3.397 0.241309239
3.979 0.35793599
4.186 0.414834168
4.905 0.643297772
4.975 0.666231221
5.767 0.836998331
5.833 0.835909718
6.767 0.938747369
7.708 0.98033239
8.27 0.981566151
10. 1.

Annahme : sie wird durch sonst-noch-Kraft angelegt und in dieser Form
soll sie ausgelesen werden.

Alles sollen Double bzw. Float Zahlen werden.

Die Zahlen der ersten Zeile werden als String ausgegeben.
Soll ich die Ausgabe der Konsole zeigen ?

Danke bis jetzt
 
Ich bin weiterhin über meinen Zweifel mit dem Scanner irritiert
aber ich habe mittlerweile StreamTokenizer eingesetzt.

verkürztes und verändertes Beispiel aus "Java ist auch eine Insel" - Ausschnitt aus Listing 12.43

Code:
import java.io.*;
class StreamTokenizerDemo
{
    public static void main(String[] args)
    {

        String fileName = args[0];
        StreamTokenizer st = new StreamTokenizer(neew FileReader(fileName));
        
        st.parseNumbers();
        st.eolIsSignificant( true );

        // die Aktion des Lesens startet

        for ( int tval; (tval = st.nextToken()) != StreamTokenizer.TT_EOF; )
        {
            //ich habe alles nicht-numerische von hier rausgeschnitten - Original ist Superklasse !
                    
                if ( tval == StreamTokenizer.TT_NUMBER )
                {
                    //wenn der Tokenizer etwas, wie eine Zahl findet, 
                    //soll sie irgendwie versuchsweise als Zahl verarbeiten)

                    System.out.println( "Zahl: " + st.nval +"   und ihr Quadrat: " + st.nval*st.nval );
                }        
        }        
    }
}

Damit habe ich mich selbst gestillt.
Jedenfalls bin ich neugierig, ob jemand den Scanner zähmen kann.
 
wie Zunera schon schrieb liegt es doch am Komma statt Punkt,
mit sc.useLocale(Locale.US);
gehts vielleicht,

--------

bei mir liest der Scanner gar nix mehr wenn das nächste Element nicht als double erkannt wird,
in einem Konstrukt wie
Code:
while(sc.hasNext())
{
    if(sc.hasNextDouble())
    d = sc.nextDouble();
    System.outprintln("double" +d );
}
liest dann auch niemand anders -> Endlosschleife,
das ist bei dir anders?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben