Discussion:
Daten aus dat-Datei auslesen??
(zu alt für eine Antwort)
Arnd Lehnen
2004-11-01 15:34:44 UTC
Permalink
Hallo,

ich muss die Werte für eine Matrix aus einer dat-Datei auslesen und habe in
der Thematik Auslesen von Daten aus Dateien überhaupt keine Erfahrung. :-)
Die Werte für eine Zeile in der Matrix stehen in der dat-Datei auch in einer
Zeile und sind durch Leerzeichen voneinander getrennt. Kann die Trennzeichen
auch ändern, wenn dies etwas hilft.

Kann mir jemand helfen und/oder einen Link zeigen, der die Thematik
anfängergerecht erklärt?

Danke für Euere Hilfe

Arnd
Michael Paap
2004-11-01 16:04:02 UTC
Permalink
Post by Arnd Lehnen
ich muss die Werte für eine Matrix aus einer dat-Datei auslesen und habe in
der Thematik Auslesen von Daten aus Dateien überhaupt keine Erfahrung. :-)
Die Werte für eine Zeile in der Matrix stehen in der dat-Datei auch in einer
Zeile und sind durch Leerzeichen voneinander getrennt. Kann die Trennzeichen
auch ändern, wenn dies etwas hilft.
Wickle einen BufferedReader um einen FileReader. Dann liest Du in einer
Schleife mit readLine() immer eine Zeilen. Diese spaltest Du dann per
String#split() an den Trennzeichen auf und bekommst pro Zeile einen
String[], dessen einzelne Elemente Du dann weiterverabeiten kannst.

Schnell hingeschlunztes Beispiel:

String fileName = "D:/test.dat";
ArrayList linesAsArrays = new ArrayList();

// zeilenweises lesen und aufspalten
try {
BufferedReader br = new BufferedReader(
new FileReader(fileName));
String line = null;
while((line = br.readLine()) != null) {
String[] lineAsArray = line.split(" ");
linesAsArrays.add(lineAsArray);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}

// testweise Ausgabe
Iterator it = linesAsArrays.iterator();
while (it.hasNext()) {
String[] current = (String[]) it.next();
for (int i = 0; i < current.length; i++) {
System.out.println(current[i]);
}
}
Post by Arnd Lehnen
Kann mir jemand helfen und/oder einen Link zeigen, der die Thematik
anfängergerecht erklärt?
Schau mal in die entsprechenden Abschnitte von
http://www.galileocomputing.de/openbook/javainsel4/javainsel_12_000.htm#Xxx999378

Gruß,
Michael
--
Die Adresse im From existiert, wird aber nicht gelesen. Sollte
eine Mail-Antwort auf ein Posting vonnöten sein, bitte folgende
Adresse verwenden: newsreply@<DOMAIN_AUS_DEM_FROM_DIESES_POSTINGS>.
Michael Rauscher
2004-11-01 16:01:06 UTC
Permalink
Hallo Arnd,
Post by Arnd Lehnen
Hallo,
ich muss die Werte für eine Matrix aus einer dat-Datei auslesen und habe in
der Thematik Auslesen von Daten aus Dateien überhaupt keine Erfahrung. :-)
Die Werte für eine Zeile in der Matrix stehen in der dat-Datei auch in einer
Zeile und sind durch Leerzeichen voneinander getrennt. Kann die Trennzeichen
auch ändern, wenn dies etwas hilft.
Kann mir jemand helfen und/oder einen Link zeigen, der die Thematik
anfängergerecht erklärt?
Naja, das sollte eigentlich in jedem halbwegs vernünftigen Java-Buch
behandelt sein.

Ich versuche mich aber trotzdem einmal an einer kleinen Einführung:

Für I/O sind im wesentlichen die Pakete java.io und java.nio zuständig.
Um Text zu lesen verwendet man i.d.R. einen sog. Reader (s.
java.io.Reader), in Deinem Fall, da der Text in einer Datei steht, einen
java.io.FileReader. Bei der Ein-/Ausgabe können Fehler auftreten, die
sich in Form einer IOException bemerkbar machen. Diese muss natürlich
vom Programm behandelt werden.

Damit der Text zeilenweise eingelesen werden kann, müssen die einzelnen
Zeichen zwischengespeichert, also gepuffert (buffered) werden. Dies
erledigt z. B. ein BufferedReader.

Die Kombination aus beiden kann nun verwendet werden, um jede Zeile
einer Datei nacheinander einzulesen:

try {
FileReader fr = new FileReader("meinedatei.dat");
BufferedReader reader = new BufferedReader(fr);

String zeile;
while ( (zeile=reader.getLine()) != null ) {
// mach was mit zeile
}

reader.close();
fr.close();
}
catch ( IOException ioe ) {
e.printStackTrace(); // Stack-Trace ausgeben, wenn ein I/O-Fehler
// aufgetreten ist.
}

Jetzt musst Du nur noch jede Zeile in einzelne Zeichenketten aufteilen.
Als Trennzeichen willst Du Whitespaces (Space, Tab, Return, ...)
verwenden. Man ersetze "// mach was mit zeile" oben durch

String zahlenString[] = zeile.split("\\S");

Jetzt muss man nur noch jeden zahlenString in eine Zahl umwandeln. Z. B.
in int-Zahlen, durch

int zahlen[] = new int[zahlenString.length];
for ( int i = 0; i < zahlenString.length; i++ ) {
zahlen[i] = Integer.parseInt(zahlenString[i]);
}

Da hier eine NumberFormatException auftreten kann, muss ein
entsprechender catch-Block her. Außerdem willst Du aus den so
entstandenen Zahlenreihen eine Matrix aufbauen. Ein einfaches Beispiel
einer Matrix erhält man, wenn man eine Liste nimmt und die Einträge
dieser Liste den Zeilen der Matrix entsprechen.

try {
ArrayList matrix = new ArrayList();

FileReader fr = new FileReader("meinedatei.dat");
BufferedReader reader = new BufferedReader(fr);

String zeile;
while ( (zeile=reader.getLine()) != null ) {
String zahlenString[] = zeile.split("\\S");

int zahlen[] = new int[zahlenString.length];
for ( int i = 0; i < zahlenString.length; i++ ) {
zahlen[i] = Integer.parseInt(zahlenString[i]);
}
matrix.add( zahlen ); // Zahlenreihe zur Matrix hinzufügen.
}

reader.close();
fr.close();

// Ausgabe der Matrix
for ( int i = 0; i < matrix.size(); i++ ) {
int zahlen[] = (int[])matrix.get(i);
for ( int j = 0; j < zahlen.length; j++ )
System.out.print( zahlen[j] + " " );
System.out.println();
}
}
catch ( IOException ioe ) {
e.printStackTrace(); // Stack-Trace ausgeben, wenn ein I/O-Fehler
// aufgetreten ist.
}
catch ( NumberFormatException nfe ) {
e.printStackTrace();
}


Alles natürlich ungetestet und ohne Gewähr.

Gruß
Michael
Wolfram Ruehaak
2004-11-05 13:25:29 UTC
Permalink
Post by Arnd Lehnen
Hallo,
ich muss die Werte für eine Matrix aus einer dat-Datei auslesen
Erfahrung. :-)
(...)
Arnd
Hallo Arnd,

ergaenzend kannst Du Dir auch das Beispiel 3.3.4. aus der FAQ dieser
Newsgroup (heute wieder gepostet) ansehen.

In wie weit das mit Java 5 jetzt einfacher geht weiss ich nicht, aber in
dem Beispiel wird ein Vector verwendet, so dass beliebig grosse Dateien
gelesen werden koennen.

Gruss Wolfram

Loading...