Text-Datei in Map

achillesat

Aktives Mitglied
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
 
S

SlaterB

Gast
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

Aktives Mitglied
So sieht mein Quellcode bis jetzt aus:

Java:
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):

Java:
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.
 
S

SlaterB

Gast
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

Aktives Mitglied
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.
 
S

SlaterB

Gast
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
 

achillesat

Aktives Mitglied
Java:
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)
 
S

SlaterB

Gast
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

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

Java:
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.
 
S

SlaterB

Gast
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
 

achillesat

Aktives Mitglied
Ich hab es jetzt mal mit dem BufferedReader gemacht:

Java:
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

Top Contributor
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"

Java:
HashMap<String, String> map = new HashMap<String, String>();

Tipp 2:
Java:
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

Top Contributor
Muss mich jetzt dran machen, die ausgelesenen Zeilen in eine Map zu packen ;)
also ein = dazwichen... ja einfach rein packen...

Java:
   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;
   }
 
G

Gast2

Gast
Die leere for-Schleife und ein bedingtes break finde ich persönlich sehr unschön.
Sowas wird normalerweise mit einer while-Schleife implementiert:
Java:
		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

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

Java:
   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;
   }

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

achillesat

Aktives Mitglied
hab es jetzt gelöst, danke für eure Tipps ;)

Java:
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

Aktives Mitglied
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 :

Java:
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

Aktives Mitglied
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.


Java:
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
 
S

SlaterB

Gast
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

Aktives Mitglied
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:

Java:
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 

		
		}

}
 
S

SlaterB

Gast
fange bitte mit folgendem Programm an:

Java:
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

Aktives Mitglied
hab den bufferedReader zwar immernoch drin aber es funktioniert jetzt ;)

Java:
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);

	}
}
 

Neue Themen


Oben