# Zugriff auf csv-Datei per hashmap



## Brian Stone (6. November 2013)

Guten Abend,

ich fang mal mit dem üblichen Gedöhns an ;-) :

Seit einer Weile beschäftige ich mit der Programmierung in Java.
Nach mehr oder weniger erfolgreichen Programmen versuche ich mich momentan an der Verarbeitung von csv-Dateien.

Bisher habe ich es geschafft eine csv-Datei zu erstellen und diese auch wieder komplett einzulesen.
Es handelt sich hierbei um eine Tabelle mit 3 Spalten und 3 Zeilen:


```
1st column;2nd column;3rd column
a to 1st col;a to 2nd col;a to 3rd col
b to 1st col;b to 2nd col;b to 3rd col
```

Nun möchte ich aber auf bestimmte Spalten zugreifen und mir den zugehörigen Inhalt anzeigen lassen.
Nach meiner Recherche eignen sich dazu wohl hashmaps am besten.

Allerdings habe ich Schwierigkeiten, das Prinzip dieser Vorgehensweise zu verstehen.
Was ich bisher verstanden habe ist, dass ich einen 'key' definiere und diesem dann einen 'value' zuordne.
Ich weiß auch, dass der 'key' einzigartig sein muss.

Mein Hauptproblem in meiner Recherche ist, dass die meisten Beispiele davon ausgehen, die erste Spalte einer Tabelle als 'keys' zu definieren.
Ich benötige allerdings die Inhalte der ersten Zeile als 'keys' und möchte dann den jeweiligen Inhalt der Spalte komplett als 'value' diesem 'key' zuordnen.

Leider habe ich absolut keine Ahnung, wie ich nun zur Lösung meines Problems komme und hoffe hier auf den richtigen Ansatz oder vielleicht sogar eine gute Erklärung zur Nutzung und Funktionsweise von hashmaps.

PS: Code zur Generierung bzw. zum Auslesen der Datei ist bereits vorhanden und kann bei Bedarf nachgereicht werden.

Vielen Dank im Voraus. ;-)


----------



## Bratkartoffel (7. November 2013)

Hi,

hier mal ein kleiner Ansatz, wie du das Lösen kannst:
- Für die Map brauchst du Map<Integer, List<String>> als Typ
- Du musst dir noch eine Zuordnung Spaltennummer <-> Spaltenname speichern
- Beim zeilenweise Auslesen und Teilen in Spalten holst du dir aus der Map die Liste mit dem Spalten-Index und fügst das Element hinzu.

Grüße,
BK


----------



## Brian Stone (7. November 2013)

Danke für den Ansatz.
Ich habe auch schon selbst etwas versucht, was sich ähnlich anhört.
Leider bekomme ich es dennoch nicht, wie gewünscht hin.
Ich glaube allerdings, dass es an meinem fehlenden Verständnis liegt. ;-)

Hier mal mein bisheriger Code:


```
private static void mapCsvFile(String file) {
		try {
			HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
			ArrayList<String> list = new ArrayList<String>();
			BufferedReader reader = new BufferedReader(new FileReader(file));
			String line = reader.readLine();

			String[] key = line.split(";");
			line = reader.readLine();
			
			for (int i = 0; i < key.length; i++) { // generates keys
				map.put(key[i], list);
				
				while (line != null) {
					String[] tmp = line.split(";");
						for (int j = 0; j < tmp.length; j++) {
							list.add(tmp[j]);
							map.put(key[j], list);
						}
					line = reader.readLine();
				}
			}
			reader.close();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
```

Wahrscheinlich werden jetzt viel Hände über vielen Köpfen zusammenschlagen.
Aber vielleicht kann man mir ja doch noch helfen.

Gruß Brian


----------



## HonniCilest (7. November 2013)

Das mit den Händen über dem Kopf triffts und das mit dem Verständnisproblem anscheinend auch ;-)
Ich versuche dir es ein wenig zu erklären, dann siehst du vielleicht, dass du grnudsätzlich richtige Ansätze hast, die aber vorallen an den falschen Stellen aufgeführt sind ;-)

Dein key-Array entspricht den Spaltenüberschriften, der Ansatz ist soweit schonmal gut. Auch hast du erkannt, dass man diesen eine Liste hinzufügen muss. Allerdings fügst du allen die gleiche Liste hinzu, das ist als ob du mehrerere Türen mit verschiedenen Schlüsseln zum gleichen Raum hättest. Du brauchst jedoch für jede Tür einen eigenen Raum. NACHDEM du also dein Haus fertig gebaut hast kannst du anfangen die Möbel hineinzustellen. Dafür musst du ERST die Tür aufschließen und dann das Möbelstück hineinstellen. Du tauschst NICHT den Raum aus.

Ich hoffe nach der etwas schrecklichen Verbildlichung ist immernoch klar worauf ich hinaus will ;-)


----------



## Brian Stone (8. November 2013)

Hallo,

danke erstmal für die Antworten,
ich habe es auch schon ein Stück weiter geschafft.
Mein Code:


```
public void mapCsvFile(String file) {
		try {
			BufferedReader reader = new BufferedReader(new FileReader(file));
			String line = reader.readLine();
			String[] key = line.split(";");
			
			while ((line = reader.readLine()) != null) {
				Map<String, String> map = new HashMap<String, String>();
				String[] value = line.split(";");
				
				for (int i = 0; i < value.length; i++) {
					map.put(key[i], value[i]);
				}
				list.add(map);
			}
			reader.close();
			System.out.println(list); // die Ausgabe ist nur für mich ;-)
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
```

Es wird nun also eine Liste erstellt, welche als jeweiliges Listenelement eine Map enthält.

[EDIT]:
Jetzt möchte ich durch diese Liste iterieren und dann das jeweilige Element(Map) nach einem Key durchsuchen.
Dann sollen alle zum Key gehörenden Werte ausgegeben werden.
Wie ich durch die Liste iteriere weiß ich, aber nicht, wie ich das Element(Map) durchsuche.


----------



## HonniCilest (8. November 2013)

Dein Ansatz mit *einer* HashMap war doch richtig! Was du jetzt daraus gemacht hast verstehe ich nicht ;-)

Versuche so vorzugehen:
1. HaspMap im Grundgerüst erstellen inklusive Spaltenüberschriften (keys) und leeren Spalten (ArrayList)
2. Zeilenweises Einlesen mit Einfügung in den jeweiligen Spalten.

```
map.get(key[i]).add(value[i]);
```
3. Spalte entspricht dann dem Inhalt der jeweiligen ArrayList, welche du über die get-Methode erhälst.


----------



## Brian Stone (20. November 2013)

Ich danke euch für die Hilfe, konnte das Problemchen lösen ;-)


----------

