dateiteile in Variablen

Isika

Grünschnabel
Hallo,
ich habe ein Problem bei dem ich nicht weiter komme :(

Und zwar habe ich eine .txt Datei welche wie folgt aufgebaut ist:

1.1
1200
40
200
600
1800
3200
5000

1.2
1200
80
400
1200
3600
6400
9000

und das relativ oft mit ähnlichen Zahlen.

Wie kann ich hier zu einem bestimmten Punkt in der Datei springen? (also z.b. zu 1.2)
Und wie kann ich dann die nachstehenden Zahlen so in eine Variable verpacken, dass die Zahl dem Hauptprogramm zurückgegeben wird wenn es danach fragt.

Bsp: Hauptprogramm braucht 1.2 mit der 2. Zahl danach.
Im nächsten Schritt braucht das Programm dann 2.3 mit der 1. Zahl danach.

Finde leider auch nichts in google...eher nur solche sachen wie ich eine datei komplett ausgebe. Aber nicht wie ich einzelne Werte in Variablen speichere.

Würde mich über einen Lösungsansat oder ein Codebeispiel freuen.

Vielen Dank im Vorraus
Julian
 
Hi und herzlich Willkommen hier bei tutorials.de,

würde hier eine Funktion wie "suche(String sektion, int index)" machen, die du dann nach deinem Beispiel mit suche("1.2", 2) aufrufen kannst.

Die Funktion öffnet die Datei und liest diese zeilenweise aus. Jede Zeile wird überprüft, ob diese die Sektion ist. Wurde die Sektion gefunden, werden noch X zeilen gelesen, wobei X die Zahl ist, die du haben willst. Diese Zeile merkst du dir, schließt die Datei und gibst das Ergebnis zurück.

Soviel mal zu dem theoretischen Teil, wenn du noch Hilfe brauchst, frag einfach :)

Gruß
BK
 
Zuletzt bearbeitet:
Danke erst mal für die schnelle Antwort.

So hatte ich mir das auch vorgestellt, konnte es nur nicht so elegant formulieren ;)

im Moment weiß ich einfach nicht wie ich das schreiben soll :/

public Str(String fileName){
zeile = 0;
try {
reader = new BufferedReader(new FileReader(fileName));
}
//TODO exception
}

private String readLine(){
if (reader == null)
return null;
try{
if (!reader.ready())
return null;
else{
boolean weiterlesen = true;
String line = null;
while(weiterlesen){
line = reader.readLine().trim();
weiterlesen = false;
zeile ++;
if (line.startsWith("position")){ //TODO Straßenname
weiterlesen = true;
}
if(weiterlesen){
line = null;
}
//TODO Variablen abfragen

}
return line;
}
}
}

}

Das ist was ich bis jetzt habe aber ich weiß nicht ob ich über diesen weg weiter komme und ob er überhaupt richtig ist
 
Hi,

setzt deinen Code nächstes mal bitte in [code=java]...[/code]-Tags, dann bleibt die Formatierung erhalten und er wird auch farblich markiert ;)

Das zeilenweise Lesen einer Datei mache ich gern in einer sehr kompakten while-Schleife, wie:
Java:
String strLine;
BufferedReader br = new BufferedReader(new FileReader(fileName));
while ((strLine = br.readLine()) != null)
  // in strLine ist nun eine Zeile vorhanden
}

So, das wäre mal das Auslesen der Datei. Als nächstes musst du die Sektion suchen. Hierfür überprüfst du, ob die aktuelle Zeile die gesuchte ist.

Java:
if(strLine.equals(section)) {
  // sektion gefunden!
}

Wenn die sektion gefunden wurde, dann musst du noch X Zeilen lesen, bis du die gewünschte gefunden hast. Das kannst du mit einer zweiten while- oder for-Schleife lösen.

Java:
for(int i=0; i<index; i++) {
  strLine = br.readLine();
}

So, das wäre mal der grundsätzliche Ablauf, zusammenkopiert sieht es dann so aus (mit der Rückgabe):
Java:
public String suche(String fileName, String section, int index) {
  String strLine;
  String ret = null;
  BufferedReader br = new BufferedReader(new FileReader(fileName));

  while ((strLine = br.readLine()) != null) {
    if(strLine.equals(section)) {
      for(int i=0; i<index; i++) {
        strLine = br.readLine();
      }
      ret = strLine;  // Fund merken
      break; // while-Schleife verlassen
    }
  }
  br.close();  // Datei schließen
  return ret; // letzten Fund zurückgeben
}

Das ist eigentlich der Hauptteil deines Programms. Was jetzt noch fehlt ist das Abfangen der Exceptions und die Behandlung jener.
Der Code oben ist übrigens nicht getestet, habe grad keinen java-Compiler zur Hand...

Gruß
BK
 
Zuletzt bearbeitet:
Man koennte doch auch direkt die Datei komplett einlesen und Pro Sektion ein Objekt erstellen, diese werden in eine ArrayList oder sowas gespeichert.
So braucht man nicht jedes mal die Datei oeffnen und schliessen. Was eleganter/ schneller ist, weiss ich nicht, kommt wahrscheinlich auch auf die Dateigroesse an, vielleicht kann da jemand was zu sagen. :D
 
Ja letztendlich bin ich auch zu dem schluss gekommen vor allem weil man dadurch die Mehrfachzugriffe verhindern könnte wenn man es nur ein mal läd.
Hab das ganze jetzt aber erst mal mit einem String versucht, wobei ich daran scheitere die Blöcke dann voneinander zu trennen.
Was für vorteile hätte eine ArrayList hier gegenüber dem String?
Und wie kann ich in der ArrayList dann dann ein Objekt pro Sektion erstellen?
 
Hi,

würde hier dann eher eine HashMap<String, ArrayList> verwenden. Diese kannst du dir vorstellen wie eine zweispaltige Datenbank-Tabelle. Die erste Spalte (String) ist ein einmaliger Schlüssel, mit der du eine Liste (ArrayList) identifizieren und finden kannst.

Praktisch bedeutet das, dass du eine HashMap hast, die Schlüssel entsprechen deiner Sektion und die ArrayList dazu die einzelnen Werte.


Gruß
BK
 
Zurück