# Textdateien mit JAVA einlesen!



## Panzer (26. Dezember 2003)

Hi Leutz !
Ich hab ein kleines bis grösseres Problem, wie kann ich mit JAVA Textdateien einlesen und den Text anschließend bearbeiten ! 

Panzer

PS der eingelesene Text soll am Ende in eine Crossreferenz  umgewandelt werden !


----------



## Thomas Darimont (26. Dezember 2003)

Servus!


```
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/*
 * Created on 26.12.2003
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */

/**
 * @author Administrator
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class Main {
	public static void main(String[] args) {
		new Main().doIt();
	}

	/**
	 * 
	 */
	private void doIt() {
		// TODO Auto-generated method stub
		File file = new File("c://stub.log"); //hier Deine Datei angeben 
		FileReader fr = null;
		try {
			fr = new FileReader(file);
			BufferedReader br = new BufferedReader(fr);

			String line = null;

			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}

			br.close();
			fr.close();

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
```




> PS der eingelesene Text soll am Ende in eine Crossreferenz umgewandelt werden !



Was meinst du damit?

Gruß Tom


----------



## Panzer (26. Dezember 2003)

*crossreferenz*

Hallo 

Ich hab noch ein kleines Problem mit dem Pfad ... kann ich da Irgenteinen nehmen  was verlangt "File datei = new File(pfad);" bei pfad  Eine direkte verzeichnis und datei angebe !?!

Eine Crossreferenz ist ein sortiertes Inhaltsverzeichnis, das angibt welche Wörter in welchen Zeilen vorkommen! 

Beispiel:
Kalle kaufte Gestern Brötchen
beim Bäcker. Gestern 

Bäcker 2 
beim 2
Brötchen 1
Gestern 1 2
Kalle 1
kaufte 1

Panzer


----------



## Thomas Darimont (27. Dezember 2003)

Servus!



```
import java.io.BufferedReader;
import java.io.File;
import java.util.Arrays;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.StringTokenizer;

/*
 * Created on 27.12.2003
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */

/**
 * @author Administrator
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class CrossMain {
	public static void main(String[] args) {
		new CrossMain().doIt();
	}

	/**
	 * 
	 */
	private void doIt() {
		// TODO Auto-generated method stub
                                          //Da wir jedes Wort nur einmal speichern wollen
                                           verwenden wir eineHashtable die für das jeweilige Wort auf unsere MyEntry Objekte abbildet.
		Hashtable ht = new Hashtable();


		File file = new File("c://Test.txt");
		FileReader fr = null;
		BufferedReader br = null;
		try {
			fr = new FileReader(file);
			br = new BufferedReader(fr);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
                                           //Die Zeile
		String line = null;
                                           Der StringTokenizer zerlegt uns den String in die einzelnen Wörter
		StringTokenizer tokenizer = null;
                                         //Hier mit sehen wir in welcher Zeile wir stehen
		int lineCnt = 0;
		try {
			while ((line = br.readLine()) != null) {
				lineCnt++;
				tokenizer = new StringTokenizer(line);

				while (tokenizer.hasMoreElements()) {

					String tmp = tokenizer.nextToken();
                                                    //ist das gefundene Wort schon in der Hashtable gespeichert?
//wenn ja, besorge dir das MyEntry Objekt zu dem Begriff und füge ein Element zu dem Zeilen (Rows) Speicher hinzu ... -> CrossReferenz
//Ist das Wort noch nicht in der HT, dann erstell ein Neues MyEntry Objekt,welches die Worte Kapselt und schreibe die Aktuelle Zeile in den Zeilenspeicher des MyEntry Objektes danach schreib Wert in die HT ...
					if (!ht.contains(tmp)) {
						MyEntry entry = new MyEntry(tmp);
						entry.getRows().add(new Integer(lineCnt));
						ht.put(tmp, entry);

					} else {

						MyEntry entry = (MyEntry) ht.get(tmp);
						entry.getRows().add(new Integer(lineCnt));

					}

				}
			}

			br.close();
			fr.close();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		Iterator iter = ht.keySet().iterator();
                                          //Hier geben wir die Wörter und die dazu gehörigen zeilen Positionen aus ...
		while (iter.hasNext()) {

			String key = (String) iter.next();
			MyEntry entry = (MyEntry) ht.get(key);
			System.out.println("Wort: " + entry.getStr());
			Object[] oa = entry.getRows().toArray();
                                                                Arrays.sort(oa);
			for (int i = 0; i < oa.length; i++) {
				System.out.println("        " + ((Integer) oa[i]).intValue());
			}
		}

	}
//Die Klasse MyEntry Kapselt für uns die "Wörter" und hat einen Speicher für die ZeilenNr. da es vorkommen kann, das ein wort in einer Zeile zweimal vorkommt verwenden wir zum Speichern der zeilen angaben einen Hashset die eine Menge
//im Mathematischen Sinn repräsentiert wobei ein element nur einmal erscheinen kann...
	class MyEntry {
		private String str;
		private HashSet rows;

		public String toString() {
			return str;
		}

		/**
		 * @param tmp
		 */
		public MyEntry(String tmp) {
			str = tmp;
			rows = new HashSet();
			// TODO Auto-generated constructor stub
		}

		public boolean equals(Object o) {
			return str.equals((String) o);
		}
                                           //diese Methode ist wichtig für das richtige Funktionieren unserer Hashtable ...
		public int hashCode() {
			return str.hashCode();
		}
		/**
		 * @return
		 */
		public HashSet getRows() {
			return rows;
		}

		/**
		 * @return
		 */
		public String getStr() {
			return str;
		}

		/**
		 * @param list
		 */
		public void setRows(HashSet set) {
			rows = set;
		}

		/**
		 * @param string
		 */
		public void setStr(String string) {
			str = string;
		}

	}

}
```

Gruß Tom


----------



## Panzer (29. Dezember 2003)

kannst du das mit dem HashTable noch mal nen bissle ausführlicher erklären ! das wäre super !

MfG Panzer

PS kann man die "aktuelle" zeile nich auch mit ReadLineNumber bekommen !


----------



## Thomas Darimont (29. Dezember 2003)

Servus!

Lies dir das hier mal durch:

http://www.galileocomputing.de/open...GleichheitstestundderHashWerteinerHashTabelle

Gruß Tom


----------



## ixnay (2. Januar 2004)

hey! ein interessantes thema!
aber kannst du bitte die funktion des MyEntry Objekts erklären?
Mein JBuilder zeigt mir dabei immer n Fehler

"Applet1.java": Symbol kann nicht aufgelöst werden: Klasse MyEntry in Klasse crossrefapplet.Applet1 in Zeile 54, Spalte 4

Oder kann man das mit nem Vektor irgendwie vereinfachen


----------



## Panzer (6. Januar 2004)

Hallo Tom!
Köntest du die Klasse MyEntry noch mal genauer erklären ! Das wäre super !

MfG Panzer


----------

