# Text-Datei in Map



## achillesat (9. Dez 2010)

Folgende Aufgabe habe ich bekommen: 

Ich soll eine txt Datei erstellen in der ca. 10 Zeichen stehen sollen wie z.B. 
- Name; 
- Straße; 
- Ort;
- PLZ; 
etc.... 

Die Text Datei soll dann ausgelesen werden und eine Map gepackt werden.


Kann mir jemand einen Tipp/Ansatz geben mit was und wie ich die Aufgabe lösen kann?


Danke schonmal


----------



## MiDniGG (9. Dez 2010)

FileWriter, FileReader, Hashmap.

HF


----------



## SlaterB (9. Dez 2010)

fang doch komplett ohne Java an und erstelle erstmal diese Datei,
da auch schon aufgeschmissen obwohl nicht ein einziger Java-Befehl beteiligt ist?

immer Schritt für Schritt vorgehen, wie alles zusammen am Ende aussieht könnte ich mir aktuell auch noch nicht vorstellen,
aber ich erkenne dort lauter kleine Teile wie
- Txt anlegen
- Txt einlesen
- eine Map deklarieren
- ..
was jeweils für sich dann gar nicht so schwer klingt, arbeite an konkreten Dingen und wenn du dann nicht weißt, wie etwa eine Datei in Java eingelesen wird, dann konkret nach diesem Befehl fragen (oder besser schon kennen/ nachschlagen/ suchen)


----------



## achillesat (9. Dez 2010)

So sieht mein Quellcode bis jetzt aus: 


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

public class Inhalt {
	public static void main(String[] args) throws FileNotFoundException,
			IOException {
		File datei = new File("C:\\Dokumente und Einstellungen\\Alex\\Desktop\\Text1.txt");
		FileReader leser = new FileReader(datei);

		// erzeugen einer Dauerschleife:
		for (;;) {
			int gelesenInt = leser.read();

			// Wenn kein Zeichen mehr zurückgegeben wird (= -1),
			// dann ist das Dateienende ereicht,
			// daher aufhören
			if (gelesenInt == -1) {
				break;
			}

			// ein char wird als integer eingelesen!
			// Daher als char umwandeln
			char gelesenChar = (char) gelesenInt;

			// Jedes Zeichen ausgeben
			System.out.print(gelesenChar);
		}
	}
}
```

Wenn ich das Programm starte werden mir die alle Zeichen aus der txt Datei auf der Kommandozeile ausgegeben. 

Nun muss ich alles in eine Map packen.
Da hab ich ein Beispiel im Internet gefunden (Quelle: Java ist auch eine Insel): 


```
HashMap<String,String> alidhersteller = new HashMap<String,String> ();  // <sup>6
 
    </sup>alidhersteller.  put  ( "Carbo, spanischer Sekt", "Freixenet" );
alidhersteller.  put  ( "ibu Stapelchips", "Bahlsen Chipsletten" );
alidhersteller.  put  ( "Ko-kra Katzenfutter", "felix Katzenfutter" );
alidhersteller.  put  ( "Küchenpapier", "Zewa" );
alidhersteller.  put  ( "Nuss-Nougat-Creme", "Zentis" );
alidhersteller.  put  ( "Pommes Frites", "McCaine" );
Die zweite HashMap soll Strings mit Zahlen assoziieren:
HashMap<String,Number> num = new HashMap<String,Number>();
num.  put  ( "zwei", 2 );    // Duch Boxing in Integer(2)
num.  put  ( "drei", 3.0 );  // dito. Double(3)
```


Da blick ich bis jetzt fast überhaupt nicht durch.


----------



## Andi_CH (9. Dez 2010)

und wie soll denn die txt-Datei aussehen?

Alle Teile (Namen etc.) auf einer Zeile?
Jedes Teil auf einer eigenen Zeile?


----------



## SlaterB (9. Dez 2010)

du musst dir zunächst eine Textdabei ausdenken,
was steht da drin, wie organsiert (zeilenweise, typ=wert?)
was soll davon in der Map landen, welches Endergebnis erwartest du?


----------



## achillesat (9. Dez 2010)

In der Txt Datei stehen die Zeichen untereinander sprich: 
Name; 
Straße; 
PLZ ORT; 
Bundesland; 
Land; 
Geburtsdatum; 
Alter; 
Hobbys; 

So untereinander sollen die auch in der Map landen.


----------



## SlaterB (9. Dez 2010)

in einer Map gibt es keine Reihenfolge und man braucht immer zwei Werte, x wird auf y gemappt,
die hersteller-Map ist da schon ein relativ gutes Beispiel,
besser wäre also z.B.
> Name=Otto
> Strasse=Schlossallee
usw., na wie du denkst

zum Einlesen am besten ein BufferedReader mit readline(), dann hast du immer eine Zeile,
diese dann in die Map einfügen


----------



## ARadauer (9. Dez 2010)

Ich würd eher mit dem BufferedReader zeilenweise lesen...


----------



## achillesat (10. Dez 2010)

```
System.out.print(gelesenChar);
			try {
				BufferedReader br = new BufferedReader(leser);

				String s;
				while ((s = br.readLine()) != null)
					System.out.println(s);

				leser.close();
			} catch (Exception e) {
				System.out.println("Exception: " + e);
			}
```

Wenn ich den Code ausführe kommt eine Exception 
Exception in thread "main" java.io.IOException: Stream closed
	at sun.nio.cs.StreamDecoder.ensureOpen(Unknown Source)
	at sun.nio.cs.StreamDecoder.read(Unknown Source)
	at sun.nio.cs.StreamDecoder.read0(Unknown Source)
	at sun.nio.cs.StreamDecoder.read(Unknown Source)
	at java.io.InputStreamReader.read(Unknown Source)
	at Inhalt.main(Inhalt.java:16)


----------



## SlaterB (10. Dez 2010)

eine Fehlermeldung also, jetzt müsstest du noch das zugehörige Programm posten oder genauer Zeile 16 markieren,
zum geposteten Code passt das kaum, nirgendwo wird 'read' aufgerufen, BufferedReader taucht im StackTrace der Fehlermeldung nicht auf,


----------



## achillesat (10. Dez 2010)

Ich lass den Code, den ich vorher gepostet habe komplett raus. 
Mein Programm sieht bis jetzt so aus: 


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

public class Inhalt {
	public static void main(String[] args) throws FileNotFoundException,
			IOException {
		HashMap map = new HashMap();
		File datei = new File(
				"C:\\Dokumente und Einstellungen\\Alex\\Desktop\\Text1.txt");
		FileReader leser = new FileReader(datei);
		// erzeugen einer Dauerschleife:
		for (;;) {
			int gelesenInt = leser.read();

			// Wenn kein Zeichen mehr zurückgegeben wird (= -1),
			// dann ist das Dateienende ereicht,
			// daher aufhören
			if (gelesenInt == -1) {
				break;
			}

			// ein char wird als integer eingelesen!
			// Daher als char umwandeln
			char gelesenChar = (char) gelesenInt;

			// Jedes Zeichen ausgeben
			System.out.print(gelesenChar);
```

Als Ausgabe bekomme ich: 
Name = Max Mustermann;
Straße = Alleeweg 19; 
Ort = 22334 Osterfeld; 
Bundesland = NRW; 
Land = Deutschland; 
Alter = 20; 
Geburtstdatum = 22.04.1990; 
Hobbys = Fußball; 


In der ersten Zeile nach der Main Methode erzeuge ich ja mit dem Befehl eine neue Hashmap:
HashMap map = new HashMap();


In der Map möchte ich nun die Werte die mir ausgegeben werden speichern.
Also als Beispiel: 
Bis zum = Zeichen ist der Schlüssel und bis zum ; ist der Wert.
Der Wert Max Mustermann soll ich den Schlüssel Name gespeichert werden.


----------



## SlaterB (10. Dez 2010)

den Plan finde ich gut, BufferedReader würde es dir normalerweise erleichtern, nach Zeilen zu trennen, die jetztige Methode tut es aber notfalls auch,
weiteres Vorgehen:
1.) alle chars in einem String oder performanter StringBuilder zusammenfügen,
dann den Gesamtstring nach Zeilenumbruch \n trennen (soweit würde dich der BufferedReader bringen) bzw. auch nach ; und = suchen und String weiter auftrennen,
die TeilStrings in die Map einfügen,

2.)
die eingelesenen chars auch wieder in einem String sammeln usw., aber gleichzeitig bzw. vorher die chars anschauen, bei einem =-Zeichen den aktuell zusammengebauten String in einer separaten Variable ablegen usw.,
immer wenn alle Strings für eine Zeile fertig vorhanden sind, dann diese in die Map einfügen


----------



## Andi_CH (10. Dez 2010)

Wie wärs mit der ganzen Klasse? (Ich bin und bleibe ein Fan von Debugger)


----------



## ARadauer (10. Dez 2010)

ARadauer hat gesagt.:


> Ich würd eher mit dem BufferedReader zeilenweise lesen...



ich bin noch immer der Meinung....


----------



## achillesat (10. Dez 2010)

Ich hab es jetzt mal mit dem BufferedReader gemacht: 


```
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;

public class Inhalte {
	public static void main(String[] args) throws FileNotFoundException,
			IOException {
		HashMap map = new HashMap();
		String key;
		String value;

		Reader datei = new FileReader(
				"C:\\Dokumente und Einstellungen\\Alex\\Desktop\\Text1.txt");
		BufferedReader leser = new BufferedReader(datei);
		for (;;) {
			String geleseneZeile = leser.readLine();

	                if (geleseneZeile == null) {
				break;
			}

			System.out.println(geleseneZeile);

		}
	}
}
```


Muss mich jetzt dran machen, die ausgelesenen Zeilen in eine Map zu packen


----------



## Andi_CH (10. Dez 2010)

Tut ja schon richtig gut ;-)

Tipp 1: -> ist einfach sicherer
(Da du key und value als String deklariert hast, nehme ich an, dass es so ist. Fall das ändert:
an erster Stelle kommt der Typ von "key" und an zweiter Stelle der von "value"


```
HashMap<String, String> map = new HashMap<String, String>();
```

Tipp 2:

```
map.put(key, value);
```

Was du allerdings im key und im Value haben willst, musst du selbst wissen.

Vorsicht: "Name" als key ist eine schlechte Idee, denn jeder key kommt in der Map nur einmal vor!
Also würde der "Jürg" vom "Gregor"  überschrieben und dieser vom "Hans", wenn denn diese Namen in dieser Reihenfolge in der Datei stehen.


----------



## ARadauer (10. Dez 2010)

> Muss mich jetzt dran machen, die ausgelesenen Zeilen in eine Map zu packen


also ein = dazwichen... ja einfach rein packen...


```
public Map<String, String> gibMirDenInahltAlsMap(File f){     
      BufferedReader reader = new BufferedReader(new FileReader(f));      
      Map<String, String> map = new HashMap<String, String>();
      String line = null;
      while((line =reader.readLine()) != null){
         String[] parts = line.split("=");
         map.put(parts[0].trim(), parts[1].trim());
      }
      return map;
   }
```


----------



## Gast2 (10. Dez 2010)

Die leere for-Schleife und ein bedingtes break finde ich persönlich sehr unschön.
Sowas wird normalerweise mit einer while-Schleife implementiert:

```
String geleseneZeile = null;	
		while((geleseneZeile = leser.readLine()) != null){
			System.out.println(geleseneZeile);
		}
```

Ist letztlich aber eine Geschmackssache... wollte nur eine Anregung geben.

Mir ist aber nicht ganz klar was du in der Map haben willst? Was willst du wohin mappen? Eine Map für jeden Datensatz?

EDIT:// ein bisschen spät


----------



## Andi_CH (10. Dez 2010)

ARadauer hat gesagt.:


> also ein = dazwichen... ja einfach rein packen...
> 
> 
> ```
> ...



So funktioniert das doch nicht! siehe oben .....
oder ist pro File nur ein user drin?


----------



## achillesat (10. Dez 2010)

Andi_CH hat gesagt.:


> So funktioniert das doch nicht! siehe oben .....
> oder ist pro File nur ein user drin?




Ja pro File ist nur ein user drin!


----------



## Andi_CH (10. Dez 2010)

hhdi hat gesagt.:


> Ja pro File ist nur ein user drin!



Ok, dann ist ja das Problem jetzt gelöst ;-)


----------



## achillesat (10. Dez 2010)

hab es jetzt gelöst, danke für eure Tipps  


```
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;

public class Inhalt {
	public static void main(String[] args) throws FileNotFoundException,
			IOException {
		Reader datei = new FileReader(
				"C:\\Dokumente und Einstellungen\\Alex\\Desktop\\Text1.txt");
		BufferedReader reader = new BufferedReader(datei);
		Map<String, String> map = new HashMap<String, String>();
		String line = null;
		while ((line = reader.readLine()) != null) {
			String[] parts = line.split(" = ");
			map.put(parts[0].trim(), parts[1].trim().replaceAll(";", ""));
		}
		System.out.println(map);
	}

}
```


----------



## achillesat (13. Dez 2010)

Ich muss die Aufabe noch ein bisschen weiter fortführen und zwar habe ich eine zweite txt Datei erstellt.
In der ersten txt Datei stehen die Schlüssel(Name;Straße;Ort;Bundesland;Land;Alter;Geburtstdatum;Hobbys; ) und in der zweiten Datei stehen die Werte(Max Mustermann;Alleeweg 22, Berlin, Berlin,Deutschland, 22, 20.01.1987, Fußball) 

Mir das das gleich dann später ausgegeben werden, sodass den Schlüsseln die Werte zugewiesen werden.
Also soll auf der Console folgendes stehen: 
Name Alexander Knieper
Straße Alleeweg 22
Ort Berlin
Bundesland Berlin
etc.... 


Folgenden Code hab ich bis jetzt : 


```
public class Inhalt {
	public static void main(String[] args) throws FileNotFoundException,
			IOException {
		Reader datei = new FileReader( // Lese die Datei ein
				"C:\\Dokumente und Einstellungen\\Alex\\Desktop\\Text1.txt"); 
		Reader values = new FileReader("C:\\Dokumnte und           Einstellungen\\Alex\\Desktop\\Values.txt"); 
		BufferedReader reader = new BufferedReader(datei); // 
		BufferedReader leser = new BufferedReader(values);
		Map<String, String> map = new HashMap<String, String>();  
		String line = null; // varibale line null setzen
		while ((line = reader.readLine()) != null) { 
			String[] parts = line.split(" = ");  
			map.put(parts[0].trim(), parts[1].trim().replaceAll(";", ""));  		}
		System.out.println(map); // map wird auf console ausgegeben 
	}

}
```

Beide Dateien werden eingelesen. was ich vor habe muss ich doch mit hashmap und vorletzten Zeile .trim lösen, oder?


----------



## achillesat (15. Dez 2010)

Ich bräuchte echt dringend Hilfe. Hab immernoch zwei txt Dateien in der einen stehen die der einen stehen die keys und in der anderen die werte. 



```
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;

public class Inhalte {
	public static void main(String[] args) throws FileNotFoundException,
			IOException {
		Reader datei = new FileReader( // Lese die Datei ein
				"C:\\Dokumente und Einstellungen\\Alex\\Desktop\\Text1.txt"); // welche datei sich wo befindet
		BufferedReader reader = new BufferedReader(datei); // 
		Map<String, String> map = new HashMap<String, String>(); // dient zum speichern von schlüsselwerten paaren
		String line = null; // varibale line null setzen
		while ((line = reader.readLine()) != null) { // Daetei wird zeilenweise gelesen(readLine) 
	
			// in die while schleife noch eine schleife die bis zum 1,2,3 etc ; liest 
			while(line.contains(";")){
				
			
			String[] parts = line.split(";");  // String wird nach bestimmten Kriterien getrennt
			map.put(parts[0].trim(), parts[1].trim().replaceAll(";", ""));  // ; wird ersetzt
		}
		}
		System.out.println(map); // map wird auf console ausgegeben 

		
		}

}
```

die dateien sehen so aus:
erste: name;straße;ort;
zweite: max;alleweg; berlin;

der soll die sachen immer bis zum ; auslesen und dann das ; rausschmeißen


----------



## SlaterB (15. Dez 2010)

ja lies doch die beiden Dateien in je einen String ein, dann fällt Datei für den Rest des Problems komplett weg,

danach beide nach ; trennen und gleichmäßig verarbeiten, 
gleiche Indexe stehen für zusammengehörige Elemente


----------



## achillesat (15. Dez 2010)

Ich habe jetzt schon so viele Sachen ausprobiert und bekomme es nicht hin, weil ich es auch nicht wirklich verstehe wie man beide Dateien in je einen String liest und danach beide nach ; trennt und verarbeitet. 

Habe bis jetzt folgenden Code in diesem Code wird aber nur eine Datei eingelesen: 


```
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;

public class Inhalte {
	public static void main(String[] args) throws FileNotFoundException,
			IOException {
		Reader datei = new FileReader( // Lese die Datei ein
				"C:\\Dokumente und Einstellungen\\Alex\\Desktop\\Text1.txt"); // welche datei sich wo befindet
		BufferedReader reader = new BufferedReader(datei); // 
		Map<String, String> map = new HashMap<String, String>(); // dient zum speichern von schlüsselwerten paaren
		String line = null; // varibale line null setzen
		while ((line = reader.readLine()) != null) { // Daetei wird zeilenweise gelesen(readLine) 
	
			// in die while schleife noch eine schleife die bis zum 1,2,3 etc ; liest 
			while(line.contains(";")){
				String key; 
				String value;  
				map.put(line, null);
				
				
				
			String[] parts = line.split(";");  // String wird nach bestimmten Kriterien getrennt
			map.put(parts[0].trim(), parts[1].trim().replaceAll(";", ""));  // ; wird ersetzt
		}
		}
		System.out.println(map); // map wird auf console ausgegeben 

		
		}

}
```


----------



## SlaterB (15. Dez 2010)

fange bitte mit folgendem Programm an:


```
class ..
main .. {
  String map1Text = loadFromFile(path1 ...); // Unter-Methode erstellen
  String map2Text = loadFromFile(path2 ...); // selbe Methode wiederverwenden
}
```
wenn dir das zu schwer ist, dann fange mit nur der erste Zeile davon an,
einen String aus einer Datei einlesen sollte inzwischen doch möglich sein,

wenn das geschafft ist will ich wirklich kein einziges Posting mehr mit 'BufferedReader' drin sehen 
danach kann man für die restliche Problembearbeitung zur Vereinfachung direkt 
>  String map1Text = "x;y;z";
ins Programm schreiben


----------



## achillesat (16. Dez 2010)

hab den bufferedReader zwar immernoch drin aber es funktioniert jetzt  


```
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;

public class Inhalte {
	public static void main(String[] args) throws FileNotFoundException,
			IOException {
		Reader text1 = new FileReader(
				"C:\\Dokumente und Einstellungen\\Alex\\Desktop\\Text1.txt");
		Reader text2 = new FileReader(
				"C:\\Dokumente und Einstellungen\\Alex\\Desktop\\Values.txt");
		BufferedReader txt1 = new BufferedReader(text1);
		BufferedReader txt2 = new BufferedReader(text2);
		Map<String, String> map = new HashMap<String, String>();

		String keys = txt1.readLine();
		String values = txt2.readLine();

		String[] keysArray = keys.split(";");
		String[] valuesArray = values.split(";");

		for (int i = 0, length = keysArray.length; i < length; i++) {
			map.put(keysArray[i].trim(), valuesArray[i].trim());
		}

		System.out.println(map);

	}
}
```


----------

