Autor Beitrag
bauerjack88
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 07.06.10 21:37 
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.


ausblenden volle Höhe 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 user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mo 07.06.2010 um 21:44
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 07.06.10 21:47 
Hallo und :welcome:, user profile iconbauerjack88!

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?

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bauerjack88 Threadstarter
Hält's aus hier
Beiträge: 2



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

ausblenden 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


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
while ( line = sr.ReadLine() )					

Gruß Jürgen