# Spalten vergleichen Java



## OnDemand (21. Apr 2014)

Hallo zusammen, kann mir jemand auf die Sprünge helfen?

Ich habe 2 csv Dateien. In Datei A:

Spalte A = ID
Spalte B = Modellnummer

Datei B:

Spalte A= Modellnummer
+ weitere Spalten

Ich muss nun die beiden Dateien einlesen und aus der Datei B, bestimmte Werte aus den Spalten D, E, F an die ID aus Datei A anhängen.

Ich hab grad null Plan, wie ich beide Dateien vergleichen kann.

Quasi, wenn ich Datei B Modellnummer "123" steckt, soll es die ID aus Datei A zugeordnet bekommen.

Hoffe mir kann jemand folgen 

Wäre für jeden Tipp dankbar, wie ich die Dateien zusammenbringen bringen kann.


----------



## BRoll (21. Apr 2014)

Auf jeden Fall musst du beide Dateien einlesen.
Je nach Anforderung würde ich beide Dateien komplett einlesen
und in eine Array oder HashMap so hinzufügen, dass der Key davon die ID der Zeile ist.
So kannst du einfach über den Key die Werte der Felder auslesen.


----------



## OnDemand (21. Apr 2014)

Das klingt gut. Du meinst ich soll die ID aus Datei A als Key nehmen??


----------



## BRoll (21. Apr 2014)

Ja für beide Dateien HashMaps anlegen in denen du dann die Werte anhand der ID
als Key einsortierst.
Dann kannst du einfach über die Keys zwischen in den Maps die verschiedenen Daten raussuchen.
Id soll ja hier der Primärschlüssel sein so wie ich das versteh?


----------



## OnDemand (21. Apr 2014)

Hi die id ist nur in einer datei drin. In datei b sind noch weitere werte, die der passenden id zugeordet werden mussen.

Mit einer hashtable konnte ich jetzt schonmal die id und modellnummer verbinden, jetzt muss ich nur noch die zusatzwerte an die passende id zuordnen. Garnicht mal so einfach

Gesendet von meinem GT-P5110 mit Tapatalk


----------



## JavaMeister (21. Apr 2014)

> Garnicht mal so einfach



Doch ist einfach. Aber in der heutigen Zeit posten alle Leute ihre Probleme in Foren und erwarten eine Lösung, die natürlich zu solch einfachen Problemen recht schnell kommt. 

Aber der Lernfaktor ist null. Und das sieht man an diesem Beitrag.

Und wenn ich dann lese:



> Gesendet von meinem GT-P5110 mit Tapatalk



Dann denke ich mir: WTF? - Derjenige, der hier so Hilfe erwartet ist irgentwo unterwegs und hat andere sorgen, als diese Sachen hier und kann sich ehh nicht vernünftige Gedanken dazu machen.

==> Mein Tipp: Wenn man wirklich sowas professionell machen möchte, dann muss man da 100 % Aufmerksamkeit und min. 3-4 Stunden täglich investieren, damit das zu einem brauchbaren Erfolg führt.


----------



## OnDemand (22. Apr 2014)

Herr Java Meister. 1. War ich ich meinem Bett unterwegs 2. Hab ich nicht nach Senf gefragt. Wer noch was sinnvolles zur Ursprungsfrage beitragen kann: Danke.


----------



## JavaMeister (22. Apr 2014)

Schade, dass Du so reagierst. Und das zeigt ja nur deine "Ersthaftigkeit" hinter der Sache


----------



## OnDemand (22. Apr 2014)

Moin, entschuldige aber wenn ich früh am morgen sowas lese, wo jemand über einen urteilt obwohl er keinen Plan hat, wie viel Aufmerksamkeit man wirklich rein steckt...find ich das bisschen respektlos und unfair.

Fühl dich bitte nicht angegriffen


----------



## JavaMeister (22. Apr 2014)

> .find ich das bisschen respektlos und unfair



So ein quatsch. Das was ich geschrieben habe nennt man "Kritik". Wenn man das in der heutigen Zeit mit repektlosigkeit und unfairness gleich setzt, dann sollte man nicht in öffentlichen Foren posten. 

---

Aber zeig mal, was du bisher hast, um das Problem abzuschließen.


----------



## OnDemand (22. Apr 2014)

Wer in öffentlichen Foren unterwegs ist, sollte sich auf das Thema beziehen und sachlich bleiben. Zurück zum Thema....


----------



## JavaMeister (22. Apr 2014)

Ja dann zeig mal deinen aktuellen Stand, damit man das abschließen kann.


----------



## OnDemand (22. Apr 2014)

Das einlesen in die Hashmap klappt. Wenn ich map.get(modellnummer) aufrufe, bekomme ich die passende ID, das funktioniert gut.

Jetzt kommt das größere Problem:

Datei B hat die modellnummer+länge+breite+höhe, was da drin fehlt ist die passende ID zur Modellnummer.

Soll heißen, wenn modelnummer aus der Hashmap in Datei B gefunden wird, soll die ID dazu geschrieben werden. Oder besser noch andersrum, wenn die modellnummer in Datei B gefunden wird, soll die höhe+breite+länge in Datei A zur passenden Modellnummer geschrieben werden.

Sollte das mit equals() machbar sein?


```
if(modelnummerDatei1.equals(modellnummerDatei2) {
system.out.println(modellnummerDatei1+map.get(modelnummerDatei1);
}
```


----------



## JavaMeister (22. Apr 2014)

Viel zu kompliziert.

1. Du machst eine Bean (e.g. Ware) mit den notwendigen Inhalten: 

- ID # muss in beiden Dateien enthalten sein und entweder "fremdschlüssel" oder "Primärschlüssel" sein.
- breite, höhe, preis

2. Du liest die Datei ein, die zu jeder Modellnummer die entsprechenden Metadaten hat.

Damit erzeugst du instanzen von Ware und schreibst diese ind ie HashMap<String, Ware>.

3. Für jede Ware aus deiner Datei A, kannst du nun folgendes machen.

HashMap.get(ID) und erhälst alle Metadaten.

Diese kannst du dann als normale Komposition in anderen Klassen nutzen.


----------



## OnDemand (22. Apr 2014)

Das klingt gut-Ich werde berichten. Danke! Aber was ist bitte eine Bean?  Hab ich noch nie gehört!


----------



## JavaMeister (22. Apr 2014)

Google danach.

[OT]Alles andere wäre wohl respektlos und unfair ;D[/OT]


----------



## OnDemand (22. Apr 2014)

Das Wort "Bean" ist mir noch nie untergekommen, selbst im Zusammenhang mit deren Bedeutung nicht. Ist das ein offizieller Begriff dafür? Steht in meinen Bücher nicht mal drin!


----------



## OnDemand (22. Apr 2014)

Ich hab mich grad belesen, dass Beans nur einen leeren Konstruktor haben? Wie soll ich denn dann eine sinnvolle Instanz davon bilden?

Edit: Oder muss auf jeden Fall ein leerer Konstruktor sein, welchen ich aber überschreiben kann?!


----------



## JavaMeister (22. Apr 2014)

Wie würdest du eine Zeile deiner Datei speichern? Bzw. im Speicher ablegen?


----------



## OnDemand (22. Apr 2014)

```
while ((line = readerID.readLine()) != null) {
			String parts[] = line.split(";");
			farbeNeuerArtikel = parts[0];
			artikelNeuerArtikel = parts[1];

			Artikel artikel = new Artikel();
			artikel.setArtikelNummer(artikelNeuerArtikel);
			artikel.setFarbe(farbeNeuerArtikel);
			System.out.println(artikel.getArtikelNummer());
```

Aber das mit dem Artikel-erzeugen scheint mir noch nicht sinnvoll. Wäre es nicht besser den Konstruktor Artikel mit Parametern (Artikel(String farbe, artikelnummer) ) zuparametrisieren?


```
new Artikel(farbeAusDatei, preisAusDatei);
```


----------



## JavaMeister (22. Apr 2014)

In diesem Fall ja, aber in allen anderen Fällen nicht. Bitte bachte, dass im Sinne eines Clean Code nicht mehr als 3 Parameter pro Methode / Konstruktor verwendet werden sollen.

Jetzt hast du eine Liste von Artikeln.

Du kannst diese nun in einer HashMap Speichern, um schneller zuzugreifen. 

Anschließend kann man diese normal verwenden.


----------



## OnDemand (22. Apr 2014)

Also meinst du, dass Artikel(String, String) in Ordnung ist?
Werd ich dann nochmal testen.
Danke schon mal!


----------



## OnDemand (22. Apr 2014)

Soooo ich hab es hinbekommen. Sieht jedenfalls gut aus, was ich bisher getestet habe. 

Noch ne Frage bezgl. deiner Bemerkung Clean Code...Ich muss in meinem Programm unter anderem Auch solche Objekte "Ware" erstellen, mit mehr als 20 Parametern/Attributen.

Wie sollte man denn sowas nach "CleanCode" handhaben?


----------



## JavaMeister (22. Apr 2014)

Wie gesagt: Man lernt einfach nicht, wenn im Forum alles erfragt. Programmieren ist hochgradig kreative Arbeit. Die kommt nicht aus einem Forum.

Clean Code Developer - Clean Code Developer

Es wäre cool, wenn du deine Lösung hier posten könntest, damit der nächste nicht Fragt wie man ein in memory join macht.


----------



## OnDemand (22. Apr 2014)

Hi JavaMeister, mach ich dann gerne. Aber nun kam ein neues Problem, super!
Die Dateien werden demnächst umstrukturiert und haben dann den Aufbau siehe Bilder.

Das heißt jedes Modell hat die selbe Artikelnummer, mit verschiedenen Attributen. In Datei A, ist diese Artikelnummer nur einmal drin, was sich in Datei B aber ändern wir (je Farbe kommt der Artikel mit der selbern Nummer hinzu). :bloed:

Hab es schon getestet, mein bisheriger Code klappt damit nicht. Muss ich mir wohl Gedanken machen, wie ich es anders löse. :-(


----------



## OnDemand (23. Apr 2014)

Soo liebe Mitlesende, schlafen hilft 

Habe nun mit frischem Geist mein Problem gelöst.

Habe 2 HashMaps erzeugt


```
Hashtable<String, String> mapID = new Hashtable<>(); // Inhalt Modellnummer, ID
Hashtable<String, Ware> mapWare = new Hashtable<>();// Inhalt: Modelnummer, Ware-Objekte
```

Dann konnte ich ganz einfach die Spalte "Modellnummer" meine neue Datei (mit den doppelten Artikelnummern) als Key nehmen und in der Hashmap die ID rausziehen und gleichzeitig mit der Modellnummer die Objekte aus der anderen Map holen.


```
mapID.get(modellNummerAusCsvDatei); //Gibt die ID aus
mapWare.get(modellNummerAusCsvDatei).getXXX(); //Gibt den Wert, je nach Getter aus der Bean ;)
```

I like HasMaps


----------

