Entwickler-Ecke
Basistechnologien - Gelesene Zeile in eine ArrayList von Objekten hinzufügen
bauerjack88 - Mo 07.06.10 21:37
Titel: Gelesene Zeile in eine ArrayList von Objekten hinzufügen
Guten Tag
ich habe ein Problem. Ich möchte einen EmailFolder analysieren. Dabei will ich jeweils den Absender, Betreff und das Datum abfange, und in ein Feld speichern. Ein Lösungsansatz war, für die drei Variablen jeweils ein Feld zu erstellen (List <string>).
Ich möchte es jedoch mit einem Feld von Objekten lösen. Aber jedes Mal, wenn ich eine gelesen Zeile in das Feld packen will, erscheint eine outofrangeexception. Schon bei der ersten Zuweisung: "meinemails[zl].absender=zeile;"
Ich bitte um Rat.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50:
| public class Email { public Email() { absender = ""; betreff = ""; datum = ""; } public string absender; public string betreff; public string datum;
public override string ToString() { return "Absender: " + absender + "\nBetreff: " + betreff + "\nDatum: " + datum; } }
class Meineemail { static void Main(string[] args) { List<Email> meinemails = new List<Email>(); StreamReader sr = new StreamReader("Inbox.txt"); string zeile = ""; int counter = 0; while (sr.ReadLine() != "ENDE") { counter++; } try { sr.BaseStream.Seek(0, SeekOrigin.Begin);
for (int zl = 0; zl < counter; ++zl) { zeile = sr.ReadLine(); if (zeile.StartsWith("From: ")) { meinemails[zl].absender = zeile; } if (zeile.StartsWith("Subject: ")) { meinemails[zl].betreff = zeile; } if (zeile.StartsWith("From - ")) { meinemails[zl].datum = zeile; } } |
Moderiert von
Christian S.: Topic aus C# - Die Sprache verschoben am Mo 07.06.2010 um 21:44
Yogu - Mo 07.06.10 21:47
Hallo und :welcome:,
bauerjack88!
Die Ausnahme wird geworfen, da
meinemails zu keiner Zeit ein Element enthält. Verwende die Methode
Add, um das zu ändern :idea:
Am besten erstellst du am Anfang jedes Schleifendurchlaufs eine Instanz von
Email, speicherst diese in einer lokalen Variable und fügst sie dann gleich mit
meinemails.Add() zu der Liste hinzu. Im folgenden können die Felder zugewiesen werden.
Allerdings verstehe ich nicht ganz, was du mit deinem Code erreichen wolltest. Wie sieht denn deine Datei aus? Etwa so?
Quelltext
1: 2: 3: 4: 5: 6: 7:
| From: abc@def.tld Subject: TheSubject From - 01.01.1990 From: 123@456.tld Subject: TheSubject2 From - 02.01.1990 ... |
Du willst sicherlich nicht für jede Zeile ein
Email-Objekt erstellen, sondern nur für jede Gruppe von Feldern. Dafür sollten wir allerdings wissen, wie die Datei genau aufgebaut ist, z.B. ob sie vielleicht immer Absender, Betreff und Datum in dieser Reihenfolge enthält (das würde einiges leichter machen).
Grüße,
Yogu
Christian S. - Mo 07.06.10 21:52
Hallo!
Erst einmal zu dem Fehler, den Du bekommst: Du greifst in der for-Schleife auf Indizies in der Liste zu, die es dort nicht gibt. Elemente fügst mittels der Add-Methode in die Liste ein.
Wie Du es also machen köntest: Du liest die Datei Zeilenweise ein. Dabei gehst Du so vor:
0. Deklariere eine Variable vom Type Email, in der Du die aktuelle E-Mail speicherst. Beispielname: currentMail
1. Lese die Datei Zeile für Zeile ein
- 2. Wenn eine Zeile mit "From :" beginnt:
-- 2.1 Wenn currentMail schon ein Objekt enthält, fügst Du es der Liste hinzu
-- 2.2 Fülle currentMail mit einer neuen Instanz von Email und setze den Absender.
- 3. Wenn eine Zeile mit "Subject: " beginnt, setzt Du den Betreff von currentMail (falls currentMail != null)
- 4. Wenn eine Zeile mit "From - "beginnt, setzt Du das datum von currentMail (falls currentMail != null)
5. Wenn am Ende der Datei noch was in currentMail drin ist, füge es der Liste hinzu
Damit brauchst Du auch die while-Schleife nicht mehr.
Grüße
Christian
P.S.: Obiges Vorgehen habe ich nur als Ideen-Skizze geschrieben, die ist sicherlich noch nicht perfekt.
bauerjack88 - Mo 07.06.10 22:00
Holla,
das ging aber schnell :)
Danke für die Antworten :D Ich werde es gleich ausprobieren
@Yogu
der Emailfolder ist selbstverständlich etwas komplexer aufgebaut. Meine Aufgabe war es, nur die oben gennanten Variablen abzufangen.
EDIT: So nun wird in der Schleife zu Beginn eine mail erstellt, die dann gleich in das Feld "meinemails" landet. Das Gute ist, es taucht keine Exception mehr auf. Die Zeile ist jedoch leer. Ich benutze zunächst einmal einen ziemlich kleinen Emailfolder:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| From: amazon.de Subject: infomail Date: 05.06.2009 From: Karl Subject: Treff Date: 01.06.2009 ENDE |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| for (int zl = 0; zl < counter; ++zl) { Email mail = new Email(); meinemails.Add(mail); zeile = sr.ReadLine(); if (zeile.StartsWith("From: ")) { meinemails[zl].absender = zeile; } |
JüTho - Di 08.06.10 09:12
Hallo und noch :welcome:
Du bringst zwei Sachen durcheinander: counter und damit z1 beziehen sich nach deinem Code auf die Zeilen der ursprünglichen Liste (das, was du wohl als EmailFolder bezeichnest). In List<Email> wäre es aber der Index einer Email. Deshalb solltest du innerhalb des Einlesens nicht mit meinemails[zl] arbeiten, sondern mit mail.
Wahrscheinlich brauchst du dann counter und z1 überhaupt nicht mehr, und die Schleife beschränkt sich auf das bei einer Textdatei übliche:
C#-Quelltext
1:
| while ( line = sr.ReadLine() ) |
Gruß Jürgen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!