OOP Einteilung einer .CSV-Datei

Basti4231

Bekanntes Mitglied
Hey, ich bins mal wieder^^

Ich habe jetzt eine Frage bezüglich des Einlesens und Unterteilen einer CSV-Datei.
Diese Datei stammt aus Outlook und dort befinden sich unwichtige (Anfang der Datei - Felder uninteressant), sowie wichtige Daten.

Ich brauche jeden Datensatz aus dieser Datei und zwar geschrieben in eine ArrayList als eine einzige Zeile.

Bis dato ist es ein wenig kompliziert einen Anfangs- und Endpunkt eines Datensatzes zu finden, der für jeden Datensatz dann auch gültig ist.

Ich hätte als Startpunkt des 1. Datensatzes die nächste Zeile nach "Weiteres Postfach" festgelegt und als End- bzw Startpunkt des neuen Datensatzes, die Zeile, die folgendes beinhaltet: ",,"",,,,"Normal","Aus"

Ich bin ein wenig durcheinander und hoffe auf gute Kommentare zu stoßen.
Ich glaube auch, dass mein Lösungsansatz nicht gerade vorbildlich ist. 😀


Hier meine .CSV:
_________________________________________

"Anrede","Vorname","Weitere Vornamen","Nachname","Suffix","Firma","Abteilung","Position","Straße geschäftlich","Straße geschäftlich 2","Straße geschäftlich 3","Ort geschäftlich","Region geschäftlich","Postleitzahl geschäftlich","Land geschäftlich","Straße privat","Straße privat 2","Straße privat 3","Ort privat","Region privat","Postleitzahl privat","Land privat","Weitere Straße","Weitere Straße 2","Weitere Straße 3","Weiterer Ort","Weitere Region","Weitere Postleitzahl","Weiteres Land","Telefon Assistent","Fax geschäftlich","Telefon geschäftlich","Telefon geschäftlich 2","Rückmeldung","Autotelefon","Telefon Firma","Fax privat","Telefon privat","Telefon privat 2","ISDN","Mobiltelefon","Weiteres Fax","Weiteres Telefon","Pager","Haupttelefon","Mobiltelefon 2","Telefon für Hörbehinderte","Telex","Abrechnungsinformation","Benutzer 1","Benutzer 2","Benutzer 3","Benutzer 4","Beruf","Büro","E-Mail-Adresse","E-Mail-Typ","E-Mail: Angezeigter Name","E-Mail 2: Adresse","E-Mail 2: Typ","E-Mail 2: Angezeigter Name","E-Mail 3: Adresse","E-Mail 3: Typ","E-Mail 3: Angezeigter Name","Empfohlen von","Geburtstag","Geschlecht","Hobby","Initialen","Internet-Frei/Gebucht","Jahrestag","Kategorien","Kinder","Konto","Name Assistent","Name des/der Vorgesetzten","Notizen","Organisations-Nr.","Ort","Partner","Postfach geschäftlich","Postfach privat","Priorität","Privat","Regierungs-Nr.","Reisekilometer","Sprache","Stichwörter","Vertraulichkeit","Verzeichnisserver","Webseite","Weiteres Postfach"
"","Marco","","Röhrs","","Genese","","",,,,,,,,,,,,,,,,,,,,,,,,"0421 - 56561-50",,,,,,,,,,,,,,,,,,,,,,,,"mroehrs@genese.de","SMTP","Marco Röhrs",,,,,,,,"0.0.00","Keine Angabe",,"M.R.",,"0.0.00",,,"",,,"Mit freundlichen Grüßen, / Best Regards,
Marco Röhrs | Development

Genese.de GmbH
Stuhrer Landstraße 4
28259 Bremen
Germany

Tel. : +49 (421) 56561-50
Fax : +49 (421) 56561-56

E-Mail : mailto:mroehrs@genese.de
Web : genese.de GmbH

",,"",,,,"Normal","Aus",,,"","","Normal"
"","Arnulf","","Götz","","GSI","","",,,,,,,,,,,,,,,,,,,,,,,"089-89 544 599","089-89 544 550",,,,,,,,,,,,,,,,,,,,,,,,"arnulf.goetz@gsi-office.de","SMTP","Arnulf Götz",,,,,,,,"0.0.00","Keine Angabe",,"A.G.",,"0.0.00",,,"",,,"Arnulf Götz
Support
------------------------------------
GSI Office Management GmbH
Bäckerstrasse 10 – Rückgebäude
81241 München
------------------------------------
Tel: +49 (89) 89 544 550
Fax: +49 (89) 89 544 599
mailto:Arnulf.Goetz@gsi-office.de
GSI Office Management GmbH, der Spezialist für Schutzrechtsverwaltung <http://www.gsi-office.de/>
HRB-München 99212
Geschäftsführer: Christian Kramer
 
Hallo,

vielleicht hilft dir die Klasse "java.util.StringTokenizer" weiter. Damit kann man einen String nach bestimmten Zeichen aufsplitten lassen.

MfG
hansmueller
 
Danke für die Info, den kenne ich schon super.
Habe es jetzt schon geschafft, trotzdem danke 🙂

Naja ok, meine Logik passt überhaupt nicht, habe ich gerade festgestellt. Esist derzeit einfach hart codiert und dadurch unflexibel.

Es gibt Zeilenumbrüche in der CSV-Datei und ich muss über deren Logik einen Datensatz herausfinden.
Jedenfalls habe ich herausgefunden dass die Zeilenumbrüche immer innerhalb von zwei Anführungszeichen sich befinden. Das sehe ich wenn ich diese Datei per Notepad++ öffne.
Zb. von
_______
"Mit freundlichen Grüßen, / Best Regards,
Marco Röhrs | Development

Genese.de GmbH
Stuhrer Landstraße 4
28259 Bremen
Germany

Tel. : +49 (421) 56561-50
Fax : +49 (421) 56561-56

E-Mail : mailto:mroehrs@genese.de
Web : genese.de GmbH

"
_______


Kann ich irgendwie die CSV-Datei hochladen, damit jemand diese auch eventuell anschauen könnte?
 
Hmm, nachdem ich mit readLine() jede Zeile dieses CSV-Dokuments eingelesen und mit einer Methode in eine ArrayList hinzufügte, stelle ich jetzt fest, wenn ich nach Zeilenumbrüchen suche, dass es anscheinend keine gibt. Ich frage mich, was ich falsch mache, oder wo meine Logik nicht passt, bin schließlich ein Anfänger 😛

Das is meine Überprüfungsmethode.

System.out.println(myM.felder.contains("\n"));

Ich glaube, dass es vielleicht an readLine() liegt, da jede Zeile einfach in die ArrayList hinzugefügt wird und dadurch kann es gut möglich sein, den Zeilenumbruch zu verlieren.

Was gäbe es für eine elegantere Variante, diesen Zeilenumbruch in der CSV-Datei zu finden?

Und hier ist noch ein Auszug mit Code, damit ihr wisst, wieso ich von readLine spreche^^

Java:
try {
            FileReader file = new FileReader(pfad);
            BufferedReader reader = new BufferedReader(file);
            while (((temp = reader.readLine()) != null)) {
lg basti :toll:
 
Zuletzt bearbeitet:
.readLine() "schluckt" die Zeilenumbrüche, da du ja sowieso Jede Zeile dann einzeln hast. Also es gibt die Zeile als String ohne das "\n" oder ähnliches zurück. Ich versteh nicht ganz wofür du dann noch die Umbrüche brauchst?!
 
Mist genau das war meine Vermutung. Ich muss aber die Zeilenumbrüche finden, um dann weiter zu arbeiten. Also kann ich readLine wohl nicht verwenden. Womit wäre das dann möglich? Mit einfachem read? Oder was gibt es für Alternativen, so dass ich die Zeilenumbrüche finden kann.
Diese muss ich in der CSV als einen Start- und Endpunkt eines Datensatzes in einer speziellen Methode dann definieren, die mir auch dann nur den Datensatz liefert.
 
Meinst du, dass ich keinen Zeilenumbruch finden kann, weil dort quasi alles in einer einzigen Zeile drinsteckt?


Und ich sehe gerade, dass zB: System.out.println(myM.felder.contains("Marco"))
nicht einmal true liefert. Aber in der Ausgabe der ArrayList steht eindeutig der "Marco" drin, das sehe ich in der Konsole
 
Zuletzt bearbeitet:
Ich versuche gerade folgendes:

SimpleReader csvread = new SimpleReader();

Wieso kann ich keinen Import von SimpleReader durchführen, es ist doch eine Klasse, die unter Object sich im Vererbungsbaum befindet.

Ich wollte die Methode parse verwenden.
 
Ich habe jetz opencsv heruntergeladen. Derzeit suche ich noch nach einer help-Datei, da ich nicht weiß, wohin ich diesen Ordner verschieben, bzw entpacken muss. Habe es schon an mehreren Orten erfolglos probiert, ich konnte immer noch nicht den CSVParser, sowie die anderen verwenden.

Könnte mir jemand vielleicht weiterhelfen?

besten Dank :toll:
 
Oder mit Ant die build.xml ausführen oder mit Maven das pom.xml kompilieren oder eben die Files im src-Folder mit in deinen Source übernehmen (das sollte die letzte Möglichkeit sein).
 
Puh, mit Ant blick ich überhaupt nicht durch. Komme nichtmal dazu, das Teil zum Ausführen zu bringen^^

Aber habe jetz einfach meinen scr-Folder "aktualisiert" 😀
 
Zuletzt bearbeitet:
Puh mir raucht schon der Schädel, den ganzen Tag versuche ich eine Lösung dafür zu finden, wie ich das Ende eines Addressdatensatzes finde, den ich dann speichern kann. 😱

Ich find keine Logik zusammen, mit der ich einen physikalischen Start- und Endpunkt eines Datensatzes herausbekomme, den ich dann als Methode darstellen kann.

Jedenfalls weiß ich sowas wie: Der Datensatz beginnt dann, wenn außerhalb zweierAnführungszeichen ein Zeilenumbruch ist und endet, wenn wieder ein Zeilenumbruch außerhalb zweier Anführungszeichen ist.
Ich habe echt keine Idee momentan, wie man sowas ungefähr umsetzen könnte, das obwohl ich jetzt den CSVParser, Writer, etc. verwenden kann^^

Mag sein, dass ich mich vielleicht kompliziert oder ungenau Ausdrücke, aber die Datei steht auf der ersten Seite, da könnt ihr mich dann vielleicht ja doch verstehen 😛
 
Zuletzt bearbeitet:
:toll:Oh mir ist grad was tolles aufgefallen. Wenn das letzte Zeichen einer Zeile ein: " :, dann beginnt folglich ein Datensatz, ah herrlich 😀😀
Falls diese Erkenntnis irgendwelche Fehler birgt, bitte mich informieren.
 
Ich habe jetz mal ganz viele Kontakte mir erstellt, als CSV exportiert und meine Logik passt für jeden Kontaktdatensatz. Es beginnt immer ein neuer, wenn vor der Zeilenschaltung ein: " ist.
Mit der Logik kann ich das jetz also endgültig übernehmen denke ich. Hoffentlich hab ich den Müll dann hinter mir, denn so langsam verliere ich die Laune daran :lol:
 
Eine letzte Frage habe ich noch.

Wenn ich folgendes sage:

Java:
while (((temp = reader.readLine()) != null)) {
   if (anführungszeichen letztes Zeichen der Zeile) {
      //jetzt sofort zur nächsten Zeile gehen und in diesem if weiterhin bleiben 
   }
}

Ist das so möglich?
Denn falls diese Bedingung zutrifft, dann möchte ich ja die darauffolgende Zeile speichern können, da dies den Datensatz beinhaltet.


lg Basti
 
Java:
while ((temp = reader.readLine()) != null) {
   if (temp.endsWith("\"")) {
      temp = reader.readLine();
      if (temp!=null) {
            //speichere temp
      }
   }
}
 
Danke Michi, so kann ich das Problem mit der ersten Zeile lösen, denn die Felder brauche ich nicht.

Ich habe aber jetzt gemerkt, dass es nichts bringt, so wie ich das bisher mache.
Wie könnte ich folgendes als Bedingung schreiben:

Fange an, Zeilen in meine ArrayList zu schreiben, wenn die aktuelle Zeile als letztes Zeichen ein: " hat und danach ein Zeilenumbruch folgt - das ganze solange, sowie eine Zeile kommt, die als letztes Zeichen ein: " hat und danach ein Zeilenumbruch folgt.

Ist dafür dann die Methode .readLine() geeignet??

Gruß Basti 🙂
 
Wieso machst du das so kompliziert? cvsreader kann doch schon von sich aus Multiline-Quoted Columns...

Java:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
    String line[];
    while ((line = reader.readNext()) != null) {
        for (int i = 0; i < line.length; i++)
            System.out.println("Column " + i + ": " + line[i]);
    }
 
Ey genial^^

Jetz muss nur der jeweiligen Abschnitt von 0 - X in mein Array hinein und dann habe ich es geschafft, hoffe ich.

Wie kann ich anstatt einzeln jedes Teil ein gesamtes Paket von 0-X hinzufügen - außer das erste Paket? Habe jedenfalls in der Schleife das hier hinzugefügt, aber damit gehts ja nur einzeln in die ArrayList hinein:

Java:
temp = line.toString();
myM.addList(temp);
 
Zuletzt bearbeitet:
Wenn dir schon jemand einen Link zu ner Lib gibt sollte man sich diesen vielleicht auch mal ansehen. Ich meine sooooo umfangreich war die HP jetzt nicht.

Java:
List<String[]> rows = new ArrayList<String[]>();
    CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
    String line[];
    while ((line = reader.readNext()) != null) {
        rows.add(line);
    }

So noch mehr vorgekaut wird nicht.
 
Vielen vielen Dank an alle, die mir geholfen haben. Ihr seid echt klasse :applaus::applaus:

Der Programmteil ist jetz endlich fertiggestellt :toll::toll::toll:


lg Basti 😀
 

Zurück
Oben