Ich habe eine Datei, txt, hier stehen immer 5 Werte (getrennt durch Leerzeichen und abgeschlossen durch ; ) die ich gerne einlesen möchte und dann übergeben möchte, z.B int Zahl1, Zahl2, Zahl3, Zahl4, Zahl5. Die fünf Zahlen benötige ich für eine spätere Berechnung.
Hat zufällig jemand ein Beispiel/Lösung wie man sowas macht?
BufferdReader buffy = new BufferedReader(new FileReader("deineDatei.txt"));
SringBuffer buff = new StringBuffer();
String line = null;
while ((line = buffy.readLine()) != null) {
buff.append(line + "
");
}
}
catch (IOException e) {
e.printStackTrace();
}```
Jetzt hast du die komplette Datei in einem StringBuffer. Aufteilen kannst du mit
```String[] teile = buff.toString().split(" ");```
und die einzelnen Teile kannst du dann so als Integer parsen
```int i = Integer.parseInt(teile[0]);```
Ah, super! Schon mal danke. Wie schaffe ich es jetzt das er mir z.B. nur eine bzw. die erste Zeile einliest. Könnte die Zahlen wie gesagt so in die txt schreiben: 1 2 3 4 5; 6 7 8 9 10; 11 12 13 14 15;
Ich kanns zwar beschränken in dem ich nur teile[0] bis teile[5] parse, aber wenn die txt jetzt ewig groß ist kostet das doch einiges an “performance”?
Wenn du einfach nur eine Zeile lesen möchtest, kannst du dir den Vergleich auf null auch schenken. Hab das nur bei mir eingebaut, damit wirklich die komplette Datei gelesen wird.
Ok, schon mal danke an alle! Jetzt hätte ich noch vierFragen:
Wenn eine Zeile z.B. so aussieht: 1 2 3 4 5; 6 7 8 9 10; 11 12 13 14 15;
Wie schaffe ich es dann, das nur immer 5 Werte eingelesen werden, sprich bis zum ; ? In diesem Fall nur 1 2 3 4 5
Kann ich es auch irgendwie machen das ich die letzte Zeile einer Datei einlese:
1 2 3 4 5; 6 7 8 9 10; 11 12 13 14 15;
16 17 18 19 20; 21 22 23 24 25; 26 27 28 29 30
Also hier sollte dann z.B. 26 27 28 29 30 eingelesen werden.
In der txt steht nach jeweils 5 Werten so ein kleines Viereck. Dürfte ein Zeilenumbruch sein? Wie sag ich Java das es sich bei dem Viereck um einen Zeilenumbruch handelt?
Wenn der Abstand zwischen den einzelnen Zeilen jetzt nicht " " ist sondern mehr bzw. variable Länge von Leerzeichen, kann ich das auch irgendwie allgemein definieren, mit WHITESPACE oder so?
Bekomme nämlich entweder:
0.0000000e+000 -7.3242000e-002 3.4668000e-001 -4.1504000e-002
5.6640600e-001;
java.lang.NumberFormatException: For input string: “5.6640600e-001;”
[QUOTE=Vril]1. Wenn eine Zeile z.B. so aussieht: 1 2 3 4 5; 6 7 8 9 10; 11 12 13 14 15;
Wie schaffe ich es dann, das nur immer 5 Werte eingelesen werden, sprich bis zum ; ? In diesem Fall nur 1 2 3 4 5[/QUOTE]
Werf einen Blick in das API. Dort wirst du beim BufferedReader noch eine anderer Methode (BufferedReader#read()) finden. Mit ihr kannst du einzelne Zeichen lesen. Du addest dann solange die Zeigen zu deinem StringBuffer bis ein Zeichen gleich einem Semikolon ist.
[QUOTE=Vril;1165]2. Kann ich es auch irgendwie machen das ich die letzte Zeile einer Datei einlese:
1 2 3 4 5; 6 7 8 9 10; 11 12 13 14 15;
16 17 18 19 20; 21 22 23 24 25; 26 27 28 29 30
Also hier sollte dann z.B. 26 27 28 29 30 eingelesen werden.[/QUOTE]
Wenn du genau die letzte Zeile haben möchtest, kannst du das z. B. so machen:
String curLine = null;
while ((curLine = buffy.readLine()) != null) {
lastLine = curLine;
}```
Ansonsten gibt es noch die Klasse RandomAccessFile. Da kannst du auch mal einen Blick reinwerfen
[QUOTE=Vril;1165]3. In der txt steht nach jeweils 5 Werten so ein kleines Viereck. Dürfte ein Zeilenumbruch sein? Wie sag ich Java das es sich bei dem Viereck um einen Zeilenumbruch handelt?[/QUOTE]
Warum willst du Java sagen, dass es sich hierbei um einen Zeilenumbruch handelt? Entweder es ist einer (dann wird er von Java beim Einlesen auch als solcher erkannt) oder eben nicht. In zweiterem Fall musst du einfach nach dem Zeichen spliten. Was ich aber eher vermute, dass es sich bei dem Zeichen sehr wohl um einen Zeilenumbruch handelt, du die Datei aber mit dem normalen Windows-Standard-Editor öffnest. Dieser erkennt nämlich ein
nicht als Zeilenumbruch, sondern lediglich
(oder so ähnlich ;) ). Öffne die Datei doch mal mit z. B. WordPad und schau ob es sich wirklich um "komische Vierecke" handelt.
[QUOTE=Vril;1165]4. Wenn der Abstand zwischen den einzelnen Zeilen jetzt nicht " " ist sondern mehr bzw. variable Länge von Leerzeichen, kann ich das auch irgendwie allgemein definieren, mit WHITESPACE oder so?
Bekomme nämlich entweder:
0.0000000e+000 -7.3242000e-002 3.4668000e-001 -4.1504000e-002
5.6640600e-001;
java.lang.NumberFormatException: For input string: "5.6640600e-001;"
ODER:
java.lang.ArrayIndexOutOfBoundsException: 3[/QUOTE]
Normal sollte das keine Probleme machen. Die NumberFormatException tritt auf, weil du versuchst das Semikolon mitzuparsen. Das funktioniert aber natürlich nicht. Du musst das Semikolon am Ende noch abschneiden. Und die ArrayIndexOutOfBoundsException hat damit schonmal gar nichts zu tun. Diese tritt auf, wenn du auf einen Array Index zugreifen willst, der nicht existiert. Du weißt schon, dass bei einem Array mit 0 angefangen wird zu zählen und nicht mit 1?
Das mit dem Array weiss ich ja…
Aber noch mal zu 3.:
Der Editor zeigt mir wie gesagt das kleine Viereck, Wordpad formatiert richtig, sprich macht saubere Zeilenumbrüche und zeigt nichts an hinsichtlich Viereck. D.h. ich muß nach dem Zeichen “Viereck” spliten? Aber wie?
So schauts bis jetzt aus:
while ((line = buffy.readLine()) != null) {
buff.append(line + "
");
System.out.println(buff);
String[] teile = buff.toString().split(" ");
Die txt sieht so aus, für das Viereck mache ich zur demonstration mal # :
Hab ich eigentlich auch so gemacht, sprich readLine und "
":
try{
BufferedReader buffy = new BufferedReader(new FileReader("auswertung.txt"));
StringBuffer buff = new StringBuffer();
String line = null;
while ((line = buffy.readLine()) != null) {
buff.append(line + "
");
System.out.println(buff);
String[] teile = buff.toString().split(" ");
Aber trotzdem folgende Fehlermeldung:
Exception in thread “main” java.lang.NumberFormatException: For input string: “5
.6640600e-001
5.0000000e-004”
at java.lang.NumberFormatException.forInputString(NumberFormatException.
java:48)
at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1
207)
at java.lang.Float.parseFloat(Float.java:222)
warum nutzt du einen Stringbuffer ? warum haengst du
an die Zeile dran ?
es geht auch ein bisschen einfacher…
Scanner sc = new Scanner(new FileInputStream("test.test"));
while(sc.hasNextDouble()) {
double d = sc.nextDouble();
System.out.println(d);
}
sc.close();
finde ebenso die zahlen in der datei von der formatierung her merkwuerdig (bsp 0.0000000e+000).
aber so liest du am einfachsten deine Zahlen aus… (das ganze geht natuerlich auch mit float anstatt double…) - die Datei ist dann einfach so aufgebaut wie du es gepostet hast