# Datei in String einlesen danach durchsuchen



## celloman (5. Oktober 2007)

Hallo

Wie kann ich eine Datei in ein string lesen es Danach es auf bestimmte Wörter durchsuchen lassen.

Bitte um Rückmeldung.

MFG


----------



## Tobias Köhler (5. Oktober 2007)

Google liefert dir Antworten.... und die Suche hier im Forum sicherlich auch
Stichwort Stream. Nur als Denkansatz, vll hilft dir das ja schon


----------



## Tobias Köhler (5. Oktober 2007)

Oder schau mal hier

```
package de.tutorials;

import java.awt.Toolkit;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

/**
 * @author tkoehler
 *
 */
public class LeseDatei {
	
	public static Shell shell;
	public static Display display;
	public static Button btn_create;	
	
	/**
	 * Die main-Methode ruft die Methoden auf
	 * und verhindert das sofortige Schließen
	 * des Fensters.
	 * @param args werden nicht benötigt.
	 */	
	public static void main(String[] args)
	{
		createWidgets();
		createListeners();
		
		shell.open();
	    
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) 
				display.sleep();
		}
		display.dispose();
	}		
//-----------------------------------------------------------------------------//
	/**
	 * In dieser Methode werden die Widgets erstellt.
	 * shell.setLocation setzt das Fenster im Verhältnis
	 * zur Auflösung in die Mitte des Displays
	 */
	public static void createWidgets()
	{	
		//---- Fenster ----
		display = new Display();
		shell = new Shell(display);
		shell.setSize(600, 400);
		shell.setLayout(null);
		
		shell.setLocation((int)
				((Toolkit.getDefaultToolkit().getScreenSize().getWidth())/2
						- (shell.getSize().x)/2),
				(int)((Toolkit.getDefaultToolkit().getScreenSize().getHeight())/2 
						- (shell.getSize().y)/2));
		
		//---- Buttons ----
		btn_create = new Button(shell, SWT.PUSH);
		btn_create.setBounds(20, 20, 100, 25);
		btn_create.setText("lese Text");		
	}	
//-----------------------------------------------------------------------------//	
	/**
	 * Erstellt die Listener für die Widgets.
	 * Listener für btn_create 
	 * ruft die Methode leseDatei() auf.
	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
	 */
	public static void createListeners()
	{
		btn_create.addListener(SWT.Selection, new Listener()
		{
			public void handleEvent(Event arg0) 
			{
				leseDatei();
			}
		});
	}	
//-----------------------------------------------------------------------------//
	/**
	 * Die Methode leseDatei() lädt die Datei lorem.txt in den Input
	 * und kopiert den Text in die Variable text. Danach wird per 
	 * StringTokenizer das nächste Wort mit "Lorem" verglichen. 
	 * Wenn true, dann i um 1 erhöhen. Nach der Schleife ausgeben.
	 * 
	 */
	public static void leseDatei()
	{
		String text = "";
		try 
		{
			BufferedReader input = new BufferedReader(new FileReader("lorem.txt"));
			String line;

			while ((line = input.readLine()) != null) {
				text = text + '\n' + line;
			}
			if (text.endsWith("\n"))
				text = text + "\n";

			input.close();
			
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
		
		StringTokenizer st = new StringTokenizer(text);
		int i = 0;
		while(st.hasMoreTokens())
		{
			if(st.nextToken().equals("Lorem"))
			{
				i++;
				st.nextToken();
			}
		}
		System.out.println("In der Datei ist das Wort Lorem " + i + "mal enthalten");
		
	}

}
```


----------



## celloman (5. Oktober 2007)

Hy Tobi

Kannst du mir vielleicht sagen wie ich eine .txt Datei sortieren Kann.

Der Inhalt sieht so aus:

Part: 1 (47)
 -3.605202648226e-001 -9.327513809436e-001  0.000000000000e+000
  9.327513809436e-001 -3.605202648226e-001  0.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  1.000000000000e+000
  8.330508804029e-021  5.711266338201e-021  0.000000000000e+000
Part: 1 (59)
  1.000000000000e+000  0.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  1.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  1.000000000000e+000
 -6.123031769112e-021  4.476963182155e+001  6.123031769112e-021
Part: 2 (59 39)
  1.000000000000e+000  0.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  1.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  1.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  0.000000000000e+000
Part: 2 (59 41)
  1.000000000000e+000  0.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  1.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  1.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  0.000000000000e+000
Part: 2 (59 43)
  9.914069416794e-001 -7.411259383905e-017  1.308138983052e-001
  0.000000000000e+000 -1.000000000000e+000  0.000000000000e+000
  1.308138983052e-001  0.000000000000e+000 -9.914069416794e-001
  0.000000000000e+000  1.040000000000e+001  0.000000000000e+000
Part: 1 (62)
  9.673187481361e-001  2.535634821980e-001  0.000000000000e+000
 -2.535634821980e-001  9.673187481361e-001  0.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  1.000000000000e+000
  1.305851933321e+001 -5.047283707516e+000  0.000000000000e+000
MaFrame 1
Part: 1 (47)
 -5.019961254070e-001 -8.648698688684e-001  0.000000000000e+000
  8.648698688684e-001 -5.019961254070e-001  0.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  1.000000000000e+000
  9.196769992950e-021  5.295625683229e-021  0.000000000000e+000
Part: 1 (59)
  1.000000000000e+000  0.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  1.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  1.000000000000e+000
 -6.123031769112e-021  4.302870001717e+001  6.123031769112e-021
Part: 2 (59 39)
  1.000000000000e+000  0.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  1.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  1.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  0.000000000000e+000
Part: 2 (59 41)
  1.000000000000e+000  0.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  1.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  1.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  0.000000000000e+000
Part: 2 (59 43)
  9.914069416794e-001 -7.411259383905e-017  1.308138983052e-001
  0.000000000000e+000 -1.000000000000e+000  0.000000000000e+000
  1.308138983052e-001  0.000000000000e+000 -9.914069416794e-001
  0.000000000000e+000  1.040000000000e+001  0.000000000000e+000
Part: 1 (62)
  9.719689857615e-001  2.351091038598e-001  0.000000000000e+000
 -2.351091038598e-001  9.719689857615e-001  0.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  1.000000000000e+000
  1.210817816416e+001 -7.027945755698e+000  0.000000000000e+000

*Den Inhalt möchte ich sortieren so zum Beispiel*

Part: 1 (47)
 -3.605202648226e-001 -9.327513809436e-001  0.000000000000e+000
  9.327513809436e-001 -3.605202648226e-001  0.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  1.000000000000e+000
  8.330508804029e-021  5.711266338201e-021  0.000000000000e+000
Part: 1 (47)
 -5.019961254070e-001 -8.648698688684e-001  0.000000000000e+000
  8.648698688684e-001 -5.019961254070e-001  0.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  1.000000000000e+000
  9.196769992950e-021  5.295625683229e-021  0.000000000000e+000

Part: 1 (59)
  1.000000000000e+000  0.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  1.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  1.000000000000e+000
 -6.123031769112e-021  4.476963182155e+001  6.123031769112e-021
Part: 1 (59)
  1.000000000000e+000  0.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  1.000000000000e+000  0.000000000000e+000
  0.000000000000e+000  0.000000000000e+000  1.000000000000e+000
 -6.123031769112e-021  4.302870001717e+001  6.123031769112e-021


usw.

Kannst du mir dabei ein Tipp geben

MFG


----------



## Tobias Köhler (5. Oktober 2007)

Mit sortieren kenn ich mich nicht so gut aus, aber du könntest das per ArrayLists lösen. Also die Datei durchsuchen, für jeden Part ne ArrayList erstellen und diese dann sortieren mit

```
Collections.sort(list, Collator.getInstance());
System.out.println(list);
```


----------



## celloman (5. Oktober 2007)

Danke, super nett von dir.
werde es versuchen.;-)

MFG


----------



## RavenOnJ (5. Oktober 2007)

Tobias Köhler hat gesagt.:


> Oder schau mal hier
> 
> ```
> ....
> ...



Bei solchen Schleifen-Konstrukten würde ich besser mit StringBuffer arbeiten, da String immutable ist, es wird also bei jeder +-Operation ein neues String-Objekt erzeugt:

```
StringBuffer text = new StringBuffer("");

...
while ((line = input.readLine()) != null) {
        text.append('\n').append(line);
}
...
```

Gruß
Peter


----------



## celloman (5. Oktober 2007)

Hy Peter

soll ich den ganzen Text in ein string laden oder meinst du jeden Part in ein extra string und dann sortieren.

MFG


----------



## Ronin-Jay (5. Oktober 2007)

@celloman:
Ich möchte ja kein Spielverderber sein, aber vielleicht solltest Du bei einem Thread bleiben. Hier hast Du auch schon danach gefragt und zerix hat Dir bereits einen Hinweis mit nem Vector gegeben, Tobi jetzt mit ner ArrayList.



> Beispiel:
> Du liest ein. Dann steht Part(...) in dem String. Diesen String und alles was danach kommt schreibst du in einen Vector. Wenn du dann wieder Part(...) einliest, schreibst du das und alles was danach kommt in einen anderen Vector. Das dann so lange weiter, bis die Datei zu ende ist. Dann hast du alles in "Blöcken" und kannst machen was du willst.



Die allgemeine vorgehensweise ist bei beiden gleich.
- einlesen bis part vollendet
- neuen Vector/ArrayList aufmachen und bis Partende füllen
- einzelne Vector/ArrayLists sortieren lassen
- neu ausgeben / in Datei schreiben


----------



## RavenOnJ (5. Oktober 2007)

celloman hat gesagt.:


> soll ich den ganzen Text in ein string laden oder meinst du jeden Part in ein extra string und dann sortieren.



Mein Posting bezog sich nur auf das vorgeschlagene Schleifen-Konstrukt,  wegen der Programmier-Hygiene . Ob es Sinn macht, den ganzen File in einen String einzulesen, und dann den String zu zerlegen, bezweifele ich. 

Ich kenne dein Sortierkriterium nicht, denke aber, es macht Sinn, die Zerlegung in die zu sortierenden Abschnitte schon beim Einlesen vorzunehmen und die Abschnitte dann in einer TreeMap abzuspeichern. Keys wären dann vermutlich die Teil-Strings, die das Token enthalten, gemäß dem sortiert werden soll (wenn ich mir deinen file so angucke, nehme ich mal an, die Keys sind keine reinen Zahlen). Dafür müßtest du dann aber vermutlich noch einen Comparator<String> implentieren.

Gruß
Peter


----------



## celloman (5. Oktober 2007)

hy 

verstehe noch nicht so richtig wie.

MFG


----------



## Tobias Köhler (5. Oktober 2007)

Um eine Aufgabe zu lösen, gibt es immer viele Wege. Genug Infos hast du nun eigentlich, jetzt liegt es an dir, das umzusetzen. Im Grunde hast du sogar schon den Code, jedenfalls die wesentlichen Teile. Jetzt musst du es nur noch ein wenig modifizieren


----------



## celloman (5. Oktober 2007)

Hy topi dein suchprogramm habe ich versucht zu compalieren geht leider nicht.

eskann meine .txt Datei nicht öffnen.

MFG


----------



## Tobias Köhler (5. Oktober 2007)

Bei mir befindet sie sich im Hauptverzeichnis des Projektes. Vll ist es leichter für dich, wenn du es so machst:

```
BufferedReader input = new BufferedReader(new FileReader("C:\\lorem.txt"));
```

Natürlich muss dann unter Laufwerk C auch diese Datei vorhanden sein
Außerdem solltest du gucken, ob du die Datei nicht vll noch geöffnet hast


----------



## celloman (5. Oktober 2007)

Bekomme diese Meldung

init:
deps-jar:
Deleted 1 out of date files in 0 seconds
Compiling 1 source file to C:\Dokumente und Einstellungen\mcelik\Desktop\Neuer Ordner (2)\Neuer Ordner\neuu\test\build\classes
compile:
run:
In der Datei ist das Wort Lorem 0mal enthalten
BUILD SUCCESSFUL (total time: 0 seconds)

Das was rot geschrieben ist kommt immer ohne die Datei geöffnet zu haben.

MFG


----------



## celloman (5. Oktober 2007)

so ist der code die Datei Murat soll geöffnet werden und nach halo suchen.geht leider nicht.



```
String text = "";
		try 
		{
			BufferedReader input = new BufferedReader(new FileReader("C://Murat.txt"));
			String line;

			while ((line = input.readLine()) != null) {
				text = text + '\n' + line;
			}
			if (text.endsWith("\n"))
				text = text + "\n";

			input.close();
			
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
		
		StringTokenizer st = new StringTokenizer(text);
		int i = 0;
		while(st.hasMoreTokens())
		{
			if(st.nextToken().equals("Hallo"))
			{
				i++;
				st.nextToken();
			}
		}
		System.out.println("In der Datei ist das Wort Lorem " + i + "mal enthalten");
```


----------



## celloman (5. Oktober 2007)

So sieht es aus, die Datei Murat.txt soll geöffnet und nach hallo durchsucht werden,geht leider nicht.



```
String text = "";
		try 
		{
			BufferedReader input = new BufferedReader(new FileReader("C://Murat.txt"));
			String line;

			while ((line = input.readLine()) != null) {
				text = text + '\n' + line;
			}
			if (text.endsWith("\n"))
				text = text + "\n";

			input.close();
			
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
		
		StringTokenizer st = new StringTokenizer(text);
		int i = 0;
		while(st.hasMoreTokens())
		{
			if(st.nextToken().equals("Hallo"))
			{
				i++;
				st.nextToken();
			}
		}
		System.out.println("In der Datei ist das Wort Lorem " + i + "mal enthalten");
```


----------



## Ronin-Jay (5. Oktober 2007)

Nun, Dein


> Bekomme diese Meldung
> 
> init:
> deps-jar:
> ...


kann ich nicht ganz nachvollziehen! 

Denn eine Ausgabe der Form:


> In der Datei ist das Wort Lorem 0mal enthalten


bedeutet er hat die Datei durchsucht. Wenn er die Datei nicht gefunden oder geöffnet hätte, würden die entsprechenden Exceptions greifen und Dir würde eine Fehlermeldung angezeigt werden..... Was steht denn genau in Deiner Textdatei drin?



Folgendes funktioniert ohne Probleme:

```
/****************************************************************************
 * <h1>
 * Title: muratExample.java
 * </h1>
 * <p>
 * Description: 
 * </p>
 * <p>
 * Copyright: Copyright (c) 2007 Ronin-Jay
 * </p>
 *
 * @author Ronin-Jay
 * @date 05.10.2007
 * @time 14:17:37
 * @version 0.1
 * --------------------------------------------------------------------------
 * @lastedit 05.10.2007 - 14:17:37
 ***************************************************************************/

package de.tutorials;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class muratExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String text = "";
		try 
		{
			BufferedReader input = new BufferedReader(new FileReader("C://Murat.txt"));
			String line;

			while ((line = input.readLine()) != null) {
				text = text + '\n' + line;
			}
			if (text.endsWith("\n"))
				text = text + "\n";

			input.close();
			
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
		
		StringTokenizer st = new StringTokenizer(text);
		int i = 0;
		while(st.hasMoreTokens())
		{
			if(st.nextToken().equals("Hallo"))
			{
				i++;
				st.nextToken();
			}
		}
		System.out.println("In der Datei ist das Wort 'Hallo' " + i + "mal enthalten");
	}

}
```


P.s.: Bitte halte Dich an die Netiquette.


----------

