# Datei zeilenweise in Strings speichern



## Guest (24. Jan 2007)

Die Überschrift sagt eigentlich schon alles über meinen Wunsch!

Also ich habe das Problem, dass ich mir bereits mehrere Dateien angelegt habe, die wie folgt aufgebaut sind:

gehen - to go
retten - to save
leben - to live
atmen - to breath
lernen - to learn

Nun würde ich gern über folgende Befehle, diese Dateien Verwenden:

angenommen F0001 = "gehen - to go"


```
int index = F0001.indexOf( '-' );                       //wäre dann 7
index = index + 4;                                          //um index hinter das "to" zu bekommen
String E0001 = F0001.substring( index );          //String E0001 = "go"
```

Das Problem dabei ist eben nur, dass ich die Zeilen einzeln auslesen muss, sonst klappt das konzept nicht und ich muss nochmal neu anfangen, zu schreiben


----------



## The_S (24. Jan 2007)

Mit "\n" fügst du einen Zeilenumbruch in einen String ein.


----------



## Guest (24. Jan 2007)

a) Danke für die schnelle Antwort!

b) Wusste ich aber selbst auch schon...

c) Bringt mich das an mein Ziel?

Ich möchte ja jede bereits in meiner Datei gespeicherten Zeile in einen einzelnen String laden, also:

"gehen - to go" in Sting s1
"retten - to save" in Sting s2
"leben - to live" in String s3
"atmen - to breath" in String s4
"lernen - to learn" in String s5

.
.
.
bis ca String s40...


----------



## The_S (24. Jan 2007)

Achso, dann hatte ich dein Problem missverstanden. Dachte du wolltest eine Datei Zeile für Zeile in einen String speichern und nicht jede Zeile in einen.

Wenn du weißt wie viele Zeilen deine Textdatei hat, dann verwende ein Array. Ansonsten eine Collection deiner Wahl. z. B.:


```
Vector<String> datei = new Vector<String>();
BufferedReader buffy = new BufferedReader(new FileReader("deineDate.txt"));
String temp = null;
while ((temp = buffy.readLine()) != null) {
   datei.add(temp);
}
```


----------



## Guest (24. Jan 2007)

Wie werden dann die einzelnen Strings benannt?

temp1, temp2, temp3?


----------



## The_S (24. Jan 2007)

Garnicht, die sind in deiner Collection und du kannst sie über den Index abfragen


```
System.out.println(datei.getElementAt(0));
```


----------



## EOB (24. Jan 2007)

das nuetzt aber nix, wenn man sowas will wie:

```
String 1 = zeile1
String 2 = zeile2
```

und so weiter. das ginge dann wohl nur mit reflection?

gruesse


----------



## The_S (24. Jan 2007)

Mørketid hat gesagt.:
			
		

> das nuetzt aber nix, wenn man sowas will wie:
> 
> ```
> String 1 = zeile1
> ...



Warum sollte man sowas wollen? :shock:


----------



## EOB (24. Jan 2007)

was weiss ich..er wills halt so. und manchmal braucht man das schon....aber imho meint er es so, wie ich es oben schrieb.

gruesse


----------



## The_S (24. Jan 2007)

Evtl. kennt er auch einfach nur nichts anderes  . Und wenn man bedenkt, dass mein Code kürzer und einfacher zu verstehen ist, sollte die Wahl auch leicht fallen  .


----------



## Guest (24. Jan 2007)

Der Code wird wahrscheinlich sehr viel kürzer 

kurze Frage noch dazu:

was muss ich dazu noch importieren.. mein Compiler meckert:


```
Vector<String> datei = new Vector<String>();
^                          ^
cannot find symbol
symbol: class Vector
```


----------



## The_S (24. Jan 2007)

Vector befindet sich im package java.util


----------



## Guest (24. Jan 2007)

mhh..

jetzt meckert der wegen:


```
symbol  : method getElementAt(int)
location: class java.util.Vector<java.lang.String>
	  System.out.println(datei.getElementAt(0));
	                          ^
```


----------



## KSG9|sebastian (24. Jan 2007)

wann braucht man jemals ne dynamische anzahl an variablen, also
String s1 - sn? Mir fällt kein Anwendungsfall ein wo das auch nur annähernd Sinn machen würde.


```
for($i=0; $i<100; $i++){
  $$i = "hallo nr. " . $i;
}
echo $45; // hallo nr. 45
```

grusliger gehts wohl kaum noch 

und wenn ich das so mach hab ich
a) übersichtlicheren code
b) keine probleme mit überschriebenen variablen (vielleicht nenn ich später noch ne variable $1 oder $a oder so..)



```
List<String> l = new ArrayList<String>();
for(int i=0; i<100; i++)7
  l.add("hallo nr." + i);
}
System.out.println(l.get(45);
```

Da ist mir doch sowas lieber


----------



## KSG9|sebastian (24. Jan 2007)

API: http://java.sun.com/j2se/1.4.2/docs/api/java/util/Vector.html#get(int)

datei.get(<index>)


----------



## The_S (24. Jan 2007)

Tatsache, die Methode heißt get bzw. elementAt. getElementAt ist absoluter Schwachsinn. Sry, mein Fehler  !


----------



## Leroy42 (24. Jan 2007)

Anonymous hat gesagt.:
			
		

> mhh..
> 
> jetzt meckert der wegen:
> 
> ...



Das war ein Schreibfehler Hobbit's. Die Methode heißt einfach nur _get_



			
				Mørketid hat gesagt.:
			
		

> was weiss ich..er wills halt so.


Typischer Fall von _er weiß nicht was er will_.

Das geht vielen Anfängern (mich nicht ausgeschlossen) so, daß sie,
solange sie noch das Konzept von Arrays und Listen nicht kennen,
_irgendwie_ auf die Idee von _durchnumerierten_ Variablen kommen.


----------



## Guest (24. Jan 2007)

^^ kein Ding
Wie wäre es denn jetzt richtig?


----------



## Leroy42 (24. Jan 2007)

Anonymous hat gesagt.:
			
		

> ^^ kein Ding
> Wie wäre es denn jetzt richtig?



So, wie es Hobbit gepostet hat.

Zum Finden deiner Vokabeln kannst du den Vector (besser ArrayList) auch
_angenehmer_ durchlaufen:


```
for (String übersetzung : übersetzungen)
  if (übersetzung.indexOf(meinSuchwort) != -1) {
    // Hier die Übersetzung rausfriemeln
  }
```


----------



## Guest (24. Jan 2007)

Also nochmal 'ne kurze Zusammenfassung:



```
BufferedReader buffy = new BufferedReader(new FileReader("C:\\Test\\Test.asd"));
String temp = null;
while ((temp = buffy.readLine()) != null) 
{
  datei.add(temp);
  for (String datei : datei)
  {
    if (datei.indexOf(gehen) != -1) 
    {
      int index = datei.indexOf( '-' );
      index = index + 4;
      loesung = datei.substring( index );
      System.out.println(loesung);
    }
  }
}
```


Würde das Funktionieren, wenn wir die Tabelle annehmen?

gehen - to go
retten - to save
leben - to live
atmen - to breath
lernen - to learn


----------



## FelixB (24. Jan 2007)

so funktioniert es definitiv nicht, weil du 'gehen' in Anführungszeichen setzen musst.

außerdem hast du da ne Schleife doppelt. Du liest eine Zeile ein, fügst diese Zeile in die Struktur "datei" (was auch immer das sein mag) ein und durchsuchst jetzt die komplette Struktur "datei" nach 'gehen'.

meine Empfehlung:

```
while( (temp = buffer.readLine()) != null) 
{
if(temp.indexOf("gehen") != -1) {
...
}
}
```
[/code]


----------



## The_S (24. Jan 2007)

Kommt darauf an was du für eine Ausgabe haben möchtest, ich würde aber mal sagen, dass die for schleife nach die while schleife muss und nicht rein.


----------



## Gast (24. Jan 2007)

habe noch ein problem entdeckt!

also ich habe die datei jetzt über RadomAccessFile geöffnet (Gründe: a) ist mir bekannt b) funktioniert auch )


```
int index = info.indexOf("laufen");
index = index + 6;
String laufen = info.substring(index);
System.out.println(laufen);
```

Eigentlich sollte er jetzt nur das Wort "laufen" ausspucken..
Leider wirft er aber die komplette Tabelle mit aus..


----------



## Leroy42 (24. Jan 2007)

Gast hat gesagt.:
			
		

> Leider wirft er aber die komplette Tabelle mit aus..



Die *komplette Tabelle*  :shock: 

Das kann doch nach deinem Code gar nicht sein!


----------



## Guest (24. Jan 2007)

Hier nochmal alles relevante:



```
RandomAccessFile patient;
p = new RandomAccessFile( "Datei-Pfad", "r" );
for ( String inf; (inf=p.readLine()) != null; )
{      
  int ix = inf.indexOf("gehen");
  ix = index + 9;
  String first = inf.substring(index);
  System.out.println(first);   
}
```

und wie gesagt, der System.out.println-Befehl liefert die komplette Tabelle!
Das einzige, was sich ändert ist, dass der zeile, in der voher das "gehen - to go" steht, dann letztlich nurnoch "to go" steht... ich möchte in dem String "first" aber nur "to go" stehen haben und nicht zusätzlich den rest der Tabelle...


----------



## Leroy42 (24. Jan 2007)

Du vermischst ja immer noch das Einlesen und das Suchen.  :shock: 

Lies erst alle Zeilen ein und speichere sie.

*Danach* kannst du die Übersetzungen beliebig of durchsuchen
*und* nur wenn indexOf() einen Wert != -1 liefert hast du deine
gesuchte Zeile überhaupt gefunden.

Ich wundere mich, warum deine Lösung nicht auch ArrayIndexOutOfBounds-Exceptions wirft-.  ???:L


----------



## Gast (24. Jan 2007)

tut sie.. habs bisher übersehen 

wie kann ich das ändern?


----------



## FelixB (24. Jan 2007)

das ist definitiv nicht alles relevante. Was ist "index"?

sag doch bitte nochmal in Ruhe, was du genau möchtest. Wieso hast du "gehen" hard codiert? Du willst doch nicht immer "gehen" ausgeben...

und was soll das mit dem "ix = index + 9"? 



ich würde sagen: gib uns bitte mal den KOMPLETTEN Quellcode sowie  die Ein- und Ausgabe.


----------



## KSG9|sebastian (24. Jan 2007)

du willst pro zeile ein eintrag haben?
dann 
-buffered reader
-reader.readLine() einlesen
-in liste speichern

nach nem wort suchen:
-liste durchlaufen
-auf jeden eintrag eintrag.indexOf(..) != -1 anwenden
-falls nicht -1 = ergebnis gefunden

würd dir raten das besser zu kapseln, z.b. ne Klasse mit zwei Variablen: deutschesWort, englischesWort oder so
das vereinfacht das ganze
oder ne map mit dem deutschen wort als key


----------



## Leroy42 (24. Jan 2007)

FelixB hat gesagt.:
			
		

> und was soll das mit dem "ix = index + 9"?



Korrekter:


```
ix = index + "gehen".length() + 4;
```
  

Gast will damit auf die englische Übersetzung seines _hardkodierten Testworts_ positionieren.


----------



## Guest (24. Jan 2007)

> das ist definitiv nicht alles relevante. Was ist "index"?
> 
> sag doch bitte nochmal in Ruhe, was du genau möchtest. Wieso hast du "gehen" hard codiert? Du willst doch nicht immer "gehen" ausgeben...
> 
> ...





Also.. Ich hab vor einer halben Ewigkeit angefangen medizinische Begriffe in txt-Dateien ab zu sichern. Mittlerweile ist daraus ein hübsches Archiv geworden und nun habe ich mir mit meinen notdürftigen Java-Kenntnissen gedacht, ich hau da Mal ein kleines Programm drüber. Zur Vereinfachung für das Forum, hab ich als Beispiel ein Deutsch-Englisch-Wörterbuch genommen, vom Prinzip ändert sich da nicht viel!

statt Einträgen wie:

Apoplex - Hirnschlag (Volksmund: Schlaganfall) => plötzlichen Durchblutungsstörung im Gehirn

habe ich vereinfachte Begriffe wie eben:

gehen - to go

Das bekomme ich hin und es ist so weit auch alles im grünen!

Die Oberfläche für dieses Programm hab ich auf ner alten Schuldiskette gefunden, nicht schön, aber selten. Da diese Oberfläche "damals" auch schon einen String ausgelesen hat und ich keine Ahnung hab, wie sich ein anderes Muster auf den Rest auswirkt, würde ich es auch gern bei einem String belassen. Also habe ich letztenendes  txt-Dateien die inhaltlich wie folgt aussehen:

Begriff1 - Erklärung1
Begriff2 - Erklärung2
Begriff3 - Erklärung3
Begriff4 - Erklärung4

Nun möchte ich nur eine Hilfestellung erhalten, um auf die Eingabe von z.B. Begriff3, die Ausgabe Erklärung3 in Form eines Strings zu erhalten.

Meine Idee war deshalb folgende:


```
RandomAccessFile medik;
medik = new RandomAccessFile( "C:\\Programme\\Studium\\Medikamente.txt", "r" ); //Einlesen der Datei
for ( String info; (info=medik.readLine()) != null; )
{     
  int index = info.indexOf(Begriff); //Vordefinierten Begriff aus der Oberfläche
  index = index + 9; //index-Wert hinter den Begriff schieben (da ich alles in Tabellenform habe, 
                     //                                        sind die Begriffszeichen immer gleich)
  String first = info.substring(index); //Informationsaufnahme von der Position des index-Wertes, 
                                        //also nur die dazugehörige Erklärung
  System.out.println(first); // Ausgeben der Erklärung, für erste Überprüfung beim programmieren
}
```


Hoffe, das war jetzt ein wenig ausführlicher.


----------



## The_S (25. Jan 2007)

```
HashMap<String, String> hash = new HashMap<String, String>
String temp = null;
String[] ar = null;
BufferedReader buffy = new BufferedReader(new FileReader("deine.txt"));
while ((temp = buffy.readLine()) != null) {
   ar = temp.split("-"); // Ich gehe davon aus, dass - dein Trennzeichen ist
   hash.put(ar[0].trim(), ar[1].trim());
}
System.out.println(hash.get("Apoplex"));
```


----------



## TeKay (25. Jan 2007)

> // Ich gehe davon aus, dass - dein Trennzeichen ist
> 
> 
> 
> ...


----------



## The_S (25. Jan 2007)

jup, dabei Hilft String#substring


----------



## TeKay (25. Jan 2007)

und wie?


----------



## The_S (25. Jan 2007)

Indem du dir deinen String mittels substring an einer bestimmten Stelle teilen lässt :roll:


----------



## KSG9|sebastian (25. Jan 2007)

hast du mal überlegt das ganze so anzupassen dass in der Datei immer Key/Value-Paare stehen?

Begriff1 = Erklärung1
Begriff2 = Erklärung2
Begriff3 = Erklärung3

Das würd's wesentlich vereinfachen. Dann kannst du nämlich n Properties-Objekt verwenden.
Beispiel

Datei c:\Begriffe.txt
Begriff1 = Erklärung1
Begriff2 = Erklärung2
Begriff3 = Erklärung3

Code


```
Properties begriffe = new Properties();
public void einlesen(){
  begriffe.load(new FileInputStream(new File("c:\\begriffe.txt")));
}
public String getErklaerung(String begriff){
  return begriffe.getProperty(begriff);
}
```
Aufruf z.B.


```
einlesen();
System.out.println("gehen"); //Erklärung für gehen wird ausgegeben, in deinem fall "to go"
```


----------

