# BufferedReader br.readLine();



## julchen81 (25. Feb 2008)

Guten Morgen!

ich lese Zeile für Zeile aus einer Datei:

while ((row = br.readLine()) != null) {...}

Innerhalb dieser while-Schleife befindet sich noch mal dieselbe while-Schleife.  Ich suche nämlich in meinem Text nach einem String, habe ich diesen dann gefunden, suche ich nach allen weiteren Vorkommen dieses Strings. Bin ich dann unten angelangt, möchte ich von vorne beginnen und dasselbe Spielchen mit einem anderen String durchführen.

Ich möchte also, dass - wenn mit der inneren while-Schleife die letzte Dateizeile erreicht ist - wieder dort weitergelesen wird, wo die erste while-Schleife noch steht.

Wie bitte geht das? Dadurch, dass ich mit der inneren while-Schleife so weit gehe, bis ich das Dateiende erreicht habe, ergibt die Bedingung ((row = br.readLine()) != null) in der ersten while-Schleife auch false und ich kann nicht mehr von vorne durchlesen.

Schönen Tag,   :wink: 
Julia


----------



## The_S (25. Feb 2008)

Speicher die Datei zeile für Zeile zuerst in z. B. einer ArrayList ab und bearbeite diese dann.


----------



## dumbi (25. Feb 2008)

Hallo Julia,

weise doch am Anfang dein readLine() 2 unterschiedlichen Variablen zu. Die eine benutzt du in der äußeren Schleife die andere in der inneren.

Weiß nicht ob es klappt bin selber noch anfänder und kann es gerade nicht testen...

Gruß


----------



## quippy (25. Feb 2008)

Du kannst den Stream zwei mal öffnen. Einmal für innen und einmal für außen. Allerdings möchtest Du ja dort mit der inneren Schleife beginnen, wo die äußere angehalten hat.

Da bleiben Dir zwei Möglichkeiten:
a) Alles in den Speicher lesen, wie bereits vorgeschlagen, und dann dort suchen (bei großen Dateien wird das ekelig)
b) statt eines Readers (mit readline) benötigst Du einen RandomAccessStream der "seeking" kann. Damit kannst Du !nur! Dateien lesen, keine URL (also Net-Streams, da die das nicht können).
Dann hast Du zwar keine readline-Funktion, aber die ist schnell selbst gebaut - wenn Du die überhaupt benötigst. Ggf. kommst Du mit einem Stream besser hin und liest immer eine fixe Anzahl bytes zum Durchsuchen.


----------



## julchen81 (25. Feb 2008)

sch..... ade, ich dachte, das geht praktischer.

Dann probier ich mal, jede Zeile in einer ArrayList abzuspeichern und diese dann zu durchsuchen.
Meine Datei besteht aus knapp 92500 Zeilen, was meint ihr dazu, ist diese Größe noch tragbar?

LG Julia


----------



## The_S (25. Feb 2008)

und wie lang sind diese Zeilen? Könnte unter Umständen mit den Standardmäßigen 64MB VM-Speicher knapp werden.


----------



## julchen81 (25. Feb 2008)

So knapp 40 Zeichen pro Zeile...


----------



## The_S (25. Feb 2008)

92500 * 40 Bytes sollte wohl in den Speicher passen. Einfach mal ausprobieren ...


----------



## julchen81 (25. Feb 2008)

Hallo,

also das Programm läuft, macht alles ganz brav... braucht allerdings rund 3min, bis es durch ist.
Wichtig ist mir nur das Ergebnis, also von daher passt es.
Allerdings würd's mich schon interessieren, wenn jm. eine bessere und schnellere Idee hätte...    

Julia


----------



## julchen81 (25. Feb 2008)

quippi hätte ja schon einen Vorschlag gemacht, aber ich bin noch nicht lange im Geschäft und versteh kaum was von dem was er schreibt   

Julia


----------



## Quaxli (25. Feb 2008)

Der Vorschlag von Hobbit_im_Blutrausch scheint mir der geschicktere Weg zu sein, als mit 2 Streams rumzufrickeln. Zumindest so vom Bauchgefühl her...


----------



## Janus (25. Feb 2008)

der vorschlag ist aber nicht sehr praktikabel, wenn die datei sehr gross werden kann.

weisst du bereits vorher, welche menge an strings du suchen willlst? dann wäre es meiner ansicht nach sinnvoller, einfach alle strings "auf einmal" zu suchen.


----------



## julchen81 (26. Feb 2008)

Guten Morgen,

ja, ich weiß wieviele Strings ich durchsuchen will:
meine Datei besteht aus knapp 92500 Zeilen, jede Zeile à ca. 40 Zeichen bzw. 7 token.

Meine Lösung braucht ca. 3min, bis das Programm durch ist.

Was meinst du bitte mit "einfach alle strings auf einmal" suchen?

Julia


----------



## Janus (26. Feb 2008)

du willst doch das vorkommen aller strings jeweils für die gesamte datei bestimmen. also kannst du jede zeile nach jedem gesuchten string durchsuchen und dir die ergebnisse merken. so wird die datei insgesamt nur einmal eingelesen, ohne aber vollständig im speicher liegen zu müssen.


----------



## Oli (26. Feb 2008)

Hallo Julia,

Janus hat recht. Und wenn du dir die Position merken musst kannst du dir ja einen Vektor basteln, in dem zu zum Beispiel dann auch die Position (mußt halt nen Spalten und Zeilenzähler mit implementieren merken kannst). Das wäre dann sinnvoll, wenn der gesuchte Text später merkiert werden müsste.

Grüße Oli


----------



## Janus (26. Feb 2008)

würd für die position wahrscheinlich einfach java.awt.Point nehmen.


----------



## Oli (26. Feb 2008)

Ja, ein Möglichkeit, allerdings dürfte das ziemlich Wurst sein, ob ich die Position in einem Array, Point oder Vecor speichere, kommt drauf an, wie und wo ich später diese gefundenen Strings identifizieren möchte.


----------



## julchen81 (26. Feb 2008)

naja, ich suche ja nicht nur nach der Anzahl, wie oft so ein String vorkommt.

Z.B. finde ich in der ersten Zeile den String I2345. Dahinter stehen noch 6 Variablen.
In einer neuen Datei möchte ich dann in einer Zeile diesen String mit allen Variablen abspeichern.
Taucht I2345 noch in anderen Zeilen meiner Ausgangsdatei auf - mit weiteren Variablen dahinter - möchte ich in meiner neuen Datei diese Variablen zu der bisherigen Zeile hinzufügen.

Also jetzt noch mal exaktes Beispiel:
in meiner Ausgangsdatei steht:
I2345 a1 b2 c3 d3 e4 f5 g6
.......
I2345 a2 b6 c8 d9 e6 f1 g9

dann möchte ich in meiner Zieldatei haben:
I2345 a1 b2 c3 d3 e4 f5 g6 a2 b6 c8 d9 e6 f1 g9

Bemerkung:
die Variable I2345 kann beliebig oft auftauchen, auch mehrere hundert mal.


Julia


----------



## Oli (26. Feb 2008)

Hallo Julia,

Ok, dann machste das erst recht mit einem Vector:

Zeile lesen -> String gefunden -> vector.add(die 6 Variablen)

Und in deine neue Datei schreibst du dann nur noch die Variable und läßt dir den Vector über ne for - Schleife auslesen.

Ist denk ich die einfachste und schnellste Methode.

Grüße Oli


----------



## julchen81 (26. Feb 2008)

Vielleicht steh ich jetzt auch auf dem Schlauch, aber....

was ändert das dann an meinem Ausgangsproblem?
Ich brauche doch nach wie vor die beiden while-Schleifen?!

Julia


----------



## Oli (26. Feb 2008)

Hallo Julia,

würde ich nicht sagen, wenn ich das Problem richtig verstanden habe, willst du in der Datei einen (oder eben mehrere) vorgegebene Strings identifizieren und dann die dahinterstehenden Werte in eine neue Datei schreiben, oder hab ich was falsch verstanden.

Grüße Oli


----------



## julchen81 (26. Feb 2008)

ja stimmt, aber wie geht das ohne 2 in einander verschachtelte Schleifen?


----------



## Oli (26. Feb 2008)

Ja.

Wenn du ein bisschen warten kannst schick ich dir den Code. Wäre aber net schlecht, wenn ich vorher von dir dir Datei zum auslesen hätte, damit ich das auch schnell testen kann. Meine email-Addi hab ich dir in einer privaten Nachricht geschickt.

Grüße Oli


----------

