# Bestimmte Stellen aus .txt Datei auslesen



## Vitamin (17. Jul 2011)

Hallo Zusammen,

Bin gerade dabei für mich ein kleines Programm zu programmieren. Ziel ist es, aus einer Textdatei bestimmte Stellen auszulesen. In der Textdatei sind alle Wörter zusammenhängend geschrieben, das heißt ohne leerstellen und mit wenigen Absätzen. Der Text ist durchgehend.

Beispiel:
dies,ist,ein_Beispiel:"yfwslrejwkrjlkewjlskjrlejrsklrjslekrj",um,das,ganze"zu,verdeutlichen".}


Habe die .txt Datei jetzt mit einem Bufferedreader eingelesen


```
BufferedReader in = new BufferedReader(new FileReader("D:\\Datenbank.txt"));
		String zeile = null;
		while ((zeile = in.readLine()) != null) {
```


Möchte nun ab einem bestimmten Wort und bis zu einem bestimmten Zeichen den Text auslesen. Das Wort kommt aber öfters in der Texdatei vor!

Habe es nun mit einem indexof hinbekommen, die Stelle des Wortes ausfindig zu machen


```
int start = zeile.indexOf("ein_Beispiel:\"");
        start=start+13;
```

Wie bekomme ich es nun hin, bis zum nächsten Ausführungszeichen auszulesen?
Habe schon ein lastindexof angelegt. 
Mit substring lasse ich dann den Textausschnitt ausgeben.


```
int ende = zeile.lastIndexOf("\"");
System.out.println(zeile.substring(start, ende));}
```

Funktioniert so aber nicht, der gibt mir dann immer den kompletten Text aus. Sobald ich ein zweites Zeichen eingebe und es somit eindeutig wird, klappt es. Dies ist aber nicht gewünscht, denn ich möchte ab dem ersten angegebenen Wort bis zum nächsten Ausführungszeichen ausgeben lassen.


Es soll immer ab dem Wort ein_Beispiel:" angefangen werden einzulesen und das immer bis zum nächsten Ausführungszeichen. Dann wieder ab dem Wort ein_Beispiel:" und bis zum nächsten Ausführungszeichen.....und so weiter....


Hoffe das mir hier jemand weiterhelfen kann.

Vielen Dank!


----------



## Gast2 (17. Jul 2011)

lastIndexOf gibt dir (wieder name schon sagt) das letzte vorkommen des zeichens. aber das willst du in deinem fall ja gar nicht.
Du kannst indexOf einen startIndex mitgeben:

```
int ende = zeile.indexOf("\"", start);
```


----------



## Vitamin (17. Jul 2011)

Ah Super! So funktioniert es! Vielen Dank für die schnelle Antwort.

Wie lasse ich denn jetzt das gleiche Wort an anderer Stelle finden? Wie schon geschrieben, es ist ein Wort das mehrmals vorkommt und ich möchte immer ab dort beginnen. 
Wie oft das Wort vorkommt, ist erstmal unbekannt.


----------



## Gast2 (17. Jul 2011)

genauso wie du nach nem " ab einer bestimmten Stelle suchst 
Du fängst zuerst bei 0 an zu suchen, beim nächsten mal fängst du an der Stelle an zu suchen an der das Wort stand, usw.
Bis du schließlich -1 zurückbekommst, es also keinen weiteren Fund gibt. Das lässt sich prima in einer Schleife lösen.


----------



## vitaminABUNDC (17. Jul 2011)

Let me google that for you

Lesson: Regular Expressions (The Java™ Tutorials > Essential Classes)


----------



## RySa (17. Jul 2011)

Versuche das:

```
Pattern pattern = Pattern.compile("ein_Beispiel:\".+\"");
Matcher matcher = pattern.matcher(zeile);

ArrayList<String> beispiele = new ArrayList<String>();
while (matcher.find()){
beispiele.add(matcher.group().replace("ein_Beispiel:" , "").replaceAll("\"" , ""));
}
```

Damit wirst du in der ArrayList nur die Texte innerhalb von den " ..... " hinter dem ein_Beispiel: haben


----------



## Vitamin (17. Jul 2011)

Ich habe das jetzt mal von dir versucht RySa, auch mit dem Beispielsatz. Bekomme dann immer folgendes Ergebnis:

[yfwslrejwkrjlkewjlskjrlejrsklrjslekrj,um,das,ganzezu,verdeutlichen]

Trotzdem Danke!



> genauso wie du nach nem " ab einer bestimmten Stelle suchst
> Du fängst zuerst bei 0 an zu suchen, beim nächsten mal fängst du an der Stelle an zu suchen an der das Wort stand, usw.
> Bis du schließlich -1 zurückbekommst, es also keinen weiteren Fund gibt. Das lässt sich prima in einer Schleife lösen.



Ich weiß nicht wie ich das mit der Schleife lösen kann. Vielleicht kann mir da noch mal jemand helfen?


----------



## RySa (17. Jul 2011)

Dann habe ich dich etwas falsch verstanden. Ich dachte nach dem ein_Beispiel: folgt nur eine Zeichenkette eingeschlossen von "...". Dann mein bespiel nochmal verbessert:

```
public static void main(String args[]){
		String zeile = "dies,ist,ein_Beispiel:\"yfwslrejwkrjlkewjlskjrlejrsklrjslekrj\",um,das,ganze\"zu,verdeutlichen\".}";
		Pattern pattern1 = Pattern.compile("ein_Beispiel:\".+\"");
		Pattern pattern2 = Pattern.compile("\"[.[^\"]]+\"");
		Matcher matcher = pattern1.matcher(zeile);
		 
		ArrayList<String> temp = new ArrayList<String>();
		ArrayList<String> beispiele = new ArrayList<String>();
		while (matcher.find()){
		temp.add(matcher.group().replace("ein_Beispiel:" , ""));
		}
		
		for(String beispiel: temp){
			matcher = pattern2.matcher(beispiel);
			while(matcher.find()){
				beispiele.add(matcher.group().replaceAll("\"", ""));
			}
		}
		
		for(String beispiel: beispiele){
			System.out.println(beispiel);
		}
	}
```

Mag vielleicht bisschen umständlich sein, erfüllt aber seinen Zweck


----------



## Vitamin (17. Jul 2011)

Dabei bekomme ich folgendes ausgegeben:

yfwslrejwkrjlkewjlskjrlejrsklrjslekrj
zu,verdeutlichen


zu,verdeutlichen darf nicht mehr mit ausgegeben werden. Die Schwierigkeit besteht aber auch darin, dass ein_Beispiel: öfters vorkommt.

Ich möchte immer die Zeichen in den Anführungsstrichen nach dem gesuchten Wort haben.

Beispiel:

dies,ist,ein_Beispiel:"*yfwslrejwkrjlkewjlskjrlejrsklrjslekrj\*",um,das,ganze\"zu,verdeutlichen\".}"und:geht,hier"noch"weiter",bis_das,Wort,wieder,erscheint,ein_Beispiel:"*aldjfkadfjahghriuzjhioatg*"und:so,weiter
,uns,so,fort,ein_Beispiel:"*ifeijortrjgoirjaegopigj*":{}


Ich möchte nun folgendes aus dem Text filtern, habe es auch fett markiert:

yfwslrejwkrjlkewjlskjrlejrsklrjslekrj\
aldjfkadfjahghriuzjhioatg
ifeijortrjgoirjaegopigj

Hoffe das es nun ein wenig verständlicher ist

Danke für deine Mühe RySa


----------



## Gast2 (17. Jul 2011)

```
String s = "dies,ist,ein_Beispiel:\"yfwslrejwkrjlkewjlskjrlejrsklrjslekrj\",um,das,ganze\"zu,verdeutlichen\".}\"und:geht,hier\"noch\"weiter\",bis_das,Wort,wieder,erscheint,ein_Beispiel:\"aldjfkadfjahghriuzjhioatg\"und:so,weiter,uns,so,fort,ein_Beispiel:\"ifeijortrjgoirjaegopigj\":{}";
		
		String searchString = "ein_Beispiel:\"";
		int start = 0;
		int pos = 0;
		
		while ((pos = s.indexOf(searchString, start)) != -1) {
			int end = s.indexOf("\"", pos + searchString.length());
			
			String sub = s.substring(pos + searchString.length(), end);
			System.out.println(sub);
			
			start = end;
		}
```


----------



## RySa (17. Jul 2011)

Konntest auch direkt sagen was du genau von dem String haben willst . Ich dachte alles das hinter ein_Beispiel in "..." eingeschlossen ist, und da waren es 2 Zeichenketten. Dann ist das ganze noch einfacher. :

```
public static void main(String args[]){
		String zeile = "dies,ist,ein_Beispiel:\"yfwslrejwkrjlkewjlskjrlejrsklrjslekrj\",um,das,ganze\"zu,verdeutlichen\".}";
		Pattern pattern = Pattern.compile("ein_Beispiel:\"[.[^\"]]+\"");
		Matcher matcher = pattern.matcher(zeile);
		 
		ArrayList<String> beispiele = new ArrayList<String>();
		
		while (matcher.find()){
			beispiele.add(matcher.group().replace("ein_Beispiel:" , "").replaceAll("\"",""));
		}
		
		for (String beispiel: beispiele){
			System.out.println(beispiel);
		}
	}
}
```


----------



## Vitamin (17. Jul 2011)

Ja, beide Varianten funktionieren!  :toll:

Vielen lieben Dank!!!


----------

