# Zahlen aus Datei in Array einlesen



## PeterchenPan (11. Dez 2008)

hallo,

leider bin ich seit einiger zeit schon nicht mehr mit java am programmieren, wollte es jetzt jedoch wieder beginnen und steh schon vor dem ersten problem. 
ich möchte gerne zahlen aus der datei "c:\zahlen.dat" in ein array einlesen. es handelt sich testweise um 5 zahlen, benoetige also kein vektor, sondern lediglich ein einfaches array.


public class ZahlenEinlesen {
    public static void main(String[] args)
    { 

      double zahlenArray[];

      for(int i=0; i<5; i++)
      {
        zahlenArray_= "Zeile i+1 der Datei";
      }

    }
}


Koennt ihr mir bitte sagen, wie ich es erweitern muss?
Danke schonmal.
MfG Peterchen_


----------



## Ebenius (11. Dez 2008)

PeterchenPan hat gesagt.:
			
		

> [...] ich möchte gerne zahlen aus der datei "c:\zahlen.dat" in ein array einlesen. [...]



Wie stehen sie denn da drinnen, die Zahlen? Davon hängt alles ab.

PS: Bitte Source-Code in [*code] (ohne '*') [*/code] einschließen.

Grüße, Ebenius


----------



## PeterchenPan (11. Dez 2008)

```
public class ZahlenEinlesen {
public static void main(String[] args)
{

double zahlenArray[];

for(int i=0; i<5; i++)
{
zahlenArray[i]= "Zeile i+1 der Datei";
}

}
}
```


in der datei stehen daten im werte von double, dh: zb 3, 34, 356.646


----------



## Ebenius (11. Dez 2008)

PeterchenPan hat gesagt.:
			
		

> in der datei stehen daten im werte von double, dh: zb 3, 34, 356.646



Also Text mit Komma getrennt. Nur eine Zeile. Fakultative Leerzeichen. So in der Art?

Dann mach ungefähr sowas:
	
	
	
	





```
Reader reader = null;
try {
  reader = new BufferedReader(new FileReader("file.dat"));
  int c;
  final StringBuffer buffer = new StringBuffer();
  while ((c = reader.read()) > -1) {
    switch (c) {
    case ' ':
    case '\t':
    case '\r':
    case '\n':
      break;
    default:
      buffer.append((char) c);
    }
  }

  // now we have the whole text w/o white spaces in buffer
  final String[] tokens = buffer.toString().split(",");
  final double[] values = new double[tokens.length];
  for (int i = 0; i < tokens.length; i++) {
    values[i] = Double.parseDouble(tokens[i]);
  }
} catch (FileNotFoundException ex) {
  ex.printStackTrace();
} catch (IOException ex) {
  ex.printStackTrace();
} finally {
  if (reader != null) {
    try {
      reader.close();
    } catch (IOException ex) {
      // ignore
    }
  }
}
```

Ich hoffe das hilft, Ebenius


----------



## PeterchenPan (11. Dez 2008)

doch so kompliziert? also die trennzeichen der datei ist egal, sollte nur n test sein, waere es zeilengetrennt einfacher?
ich dachte mir das so, weiss nur nicht, ob es in java möglich ist, ich verknuepfe die datei und lese eine zeile aus, dann wandle ich sie in ein double und fuelle sie in ein array-feld.


also wirklich nach meinem ansatz:

```
for(int i=0; i<5; i++)
{
zahlenArray[i]= "Zeile i+1 der Datei";
}
```


----------



## Ebenius (11. Dez 2008)

:idea:  Zeilenweise... hatte ich glatt überlesen. Das macht's deutlich einfacher.

Du meinst das grob so, oder (Exceptions musst Du selber noch fangen):
	
	
	
	





```
final double[] array = new double[5];

final BufferedReader r = new BufferedReader(new FileReader("foo"));
String line;
for(int i = 0; i < array.length && (line = r.readLine()) != null; i++) {
  array[i] = Double.parseDouble(line);
}
r.close();
```

Grüße, Ebenius


----------



## PeterchenPan (11. Dez 2008)

vielen dank schonmal für deine schnellen Antworten. hab jetzt mal einen test laufen lassen und hab eine fehlerausgabe, welche mir nicht viel sagt. hat dazu jmd eine idee?


```
public class ZahlenEinlesen {
public static void main(String[] args){


double minimum=0;
double maximum=0;
double summe=0;




final double[] array = new double[5];

final BufferedReader r = new BufferedReader(new FileReader("zahlen.dat"));
String line;
for(int i = 0; i < array.length && (line = r.readLine()) != null; i++) {
  array[i] = Double.parseDouble(line);
}
r.close();


for(int i=0; i<100; i++)
{

if (minimum > array[i])
{
minimum=array[i];
}

if (maximum < array[i])
{
maximum=array[i];
}

summe=summe+array[i];

}

System.out.println( "Das Minimum ist: "+ minimum);
System.out.println( "Das Maximum ist: "+ maximum);
System.out.println( "Der Durchschnitt ist: "+ (summe/100));

}
}
```


eclipse sagt:

	BufferedReader cannot be resolved to a type
	BufferedReader cannot be resolved to a type
	FileReader cannot be resolved to a type

	at ZahlenEinlesen.main(ZahlenEinlesen.java:14)

desweiteren frag ich mich, wie ich den pfad zu der datei eingeben kann.
MfG
Peterchen


----------



## Ebenius (12. Dez 2008)

PeterchenPan hat gesagt.:
			
		

> eclipse sagt:
> 
> BufferedReader cannot be resolved to a type
> BufferedReader cannot be resolved to a type
> ...



Huh? Imports hast Du gesetzt, oder? *Rechtsklick » Source » Organize Imports*

Wenn das erst zur Laufzeit auftritt, dann haste irgendwas vermurkst.



			
				PeterchenPan hat gesagt.:
			
		

> desweiteren frag ich mich, wie ich den pfad zu der datei eingeben kann.



In meinem Code-Beispiel oben, in Zeile drei steht:
	
	
	
	





```
final BufferedReader r = new BufferedReader(new FileReader("foo"));
```
 "foo" ist dabei der Dateiname (kann also auch "/home/ebenius/foo.txt", oder "C:\Documents and Settings\ebenius\My Documents\foo.txt" sein). Wo Du den Dateinamen herbekommst? Entweder ist er immer gleich, oder Du übergibst ihn beim Programmaufrauf (dann wird er in der main()-Methode mitgegeben), oder Du liest Ihn aus nem .properties-File, oder Du fragst ihn in ner GUI ab (JFileChooser), oder Du fragst ihn in _stdin_ ab (System.in), oder ...

Hilft das? Ebenius


----------



## PeterchenPan (12. Dez 2008)

irgendwie ist da echt der wurm drin. immer noch ein fehler in der folgenen zeile. hab schon ' und " getestet mit " gibts nur fehler mit ' bekomme ich den unten angeführten.



```
final BufferedReader r = new BufferedReader(new FileReader('G:\zahlen.dat'));
```

Fehlerausgabe mit ':
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	Invalid character constant

Fehlerausgabe mit ":
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	Invalid escape sequence (valid ones are  \b  \t  \n  \f  \r  \"  \'  \\ )


----------



## Ebenius (12. Dez 2008)

String in doppelten Hochkomma. Welche Fehlermeldung kommt dann?


----------



## PeterchenPan (12. Dez 2008)

Fehlerausgabe mit ":
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )


----------



## Ebenius (12. Dez 2008)

In Strings Backslashes immer doppelt. Also "G:\\zahlen.dat".

Und nun?


----------



## PeterchenPan (12. Dez 2008)

wie gesagt, das wird zur sisyphusarbeit:

Unhandled exception type FileNotFoundException
Unhandled exception type IOException
Unhandled exception type IOException


----------



## Ebenius (12. Dez 2008)

PeterchenPan hat gesagt.:
			
		

> wie gesagt, das wird zur sisyphusarbeit:
> 
> Unhandled exception type FileNotFoundException
> Unhandled exception type IOException
> Unhandled exception type IOException



:-/ Musst natürlich noch die Exceptions abfangen. *try* und *catch* sollte man kennen. Wenn Du's nicht kennst, dann such Dir mal ein Java-Buch oder einen Online-Kurs.

Für den Anfang hilft allerdings in Zeile drei (aus Deinem Beispiel oben) das da zu schreiben:
	
	
	
	





```
public static void main(String[] args) throws Exception {
```

Und nun?


----------



## PeterchenPan (12. Dez 2008)

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
	at ZahlenEinlesen.main(ZahlenEinlesen.java:29)


sind aber definitiv 5 zeilen

oh man, nachdem das ding laeuft mach ich mich nochmal langsam mit leichteren sachen fit. dachte der wieder umstieg waere nicht so problematisch.


----------



## Ebenius (12. Dez 2008)

```
for(int i=0; i<100; i++) 
{ 

if (minimum > array[i]) 
{ 
minimum=array[i]; 
} 

if (maximum < array[i]) 
{ 
maximum=array[i]; 
} 

summe=summe+array[i]; 

}
```

sind aber nicht 100, oder? :-D

Nicht verzagen!


----------



## PeterchenPan (12. Dez 2008)

ich geh ein, wieso hab ich da 100 reingeschrieben? vllt war ich ja noch in der binaerschreibweise, da ein array ja bei 0 beginnt endet es bei 4.
denke nur nicht, dass ich mich damit rausreden kann, oder? 

naja jetzt laeuft es.

vielen vielen dank.


----------



## Ebenius (12. Dez 2008)

PeterchenPan hat gesagt.:
			
		

> vllt war ich ja noch in der binaerschreibweise [...] damit rausreden [...]



Es gab schon wesentlich schlimmere Ausreden. Kein Problem, einfach weiter lernen, dann macht's auch Spaß.

Bis die Tage, Ebenius


----------



## Lexi (10. Jan 2009)

Ich stehe vor einem ähnlichen Problem. Bei mir enthält eine Text Datei in jeder Zeile 2 Worte die durch ein | getrennt sind. Genauer gesagt ist alles was auf einer Seite des | steht ein zusammenhängendes Wort.
Also "Hallo da draussen|Hallo zurueck"  --> 1.Wort : "Hallo da draussen"  2.Wort : "Hallo zurueck".

Ich möchte diese beiden Worte jetzt in jeweils eine ArrayList einlesen, eine für die Worte links vom | und eine für die rechts vom | .

Leider habe ich an einigen Stelle noch Verständnisschwierigkeiten was den untenstehenden Code angeht...




			
				Ebenius hat gesagt.:
			
		

> Dann mach ungefähr sowas:
> 
> ```
> Reader reader = null;
> ...


----------



## Landei (10. Jan 2009)

Edit: schon wieder überholt


----------



## Lexi (10. Jan 2009)

Landei hat gesagt.:
			
		

> Edit: schon wieder überholt



Was meinst du damit ?

Ich habe noch kein Antwort auf meine Frage ...


----------



## Landei (10. Jan 2009)

Weil meine Antwort auf PeterchenPan bezogen war.
Bei deinem Code würde ich vorschlagen, statt mit BufferedReader.read mit BufferedReader.readLine gleich die ganze Zeile einzulesen, das ist wesentlich einfacher. Dann bei "|" splitten, wie du schon richtig erkannt hast. Dann values[0] in die eine und values[1] in die andere ArrayList adden.


----------

