ical Datei einlesen und z.B. eingetragen Feiertage in einer Tabelle ausgeben in C#.

Schm1tty

Grünschnabel
Hallo Liebe Leute,

ich bin neu in der IT und kann noch nicht so gut Programmieren. Ich habe die Aufgabe bekommen eine ical-Datei einzulesen und bestimmte Tage in einer Tabelle auszugeben in C#. Diese Anwendung wird Später in ein Programm eingebaut. Da es jetzt meine erste Aufgabe ist hab ich kein schimmer wie ich an die Sache ran gehen soll und wie ich das alles mache. Kann mir jemand Bitte Helfen oder Tipps geben?

Lieben Dank im voraus.
 
Hi

Schritt 1 ist dann wohl mal, es zu schaffen, eine Tabelle mit irgendwelchen Daten anzuzeigen.
Und hier ist es für uns etwas schwierig, dir sofort eine genaue Antwort zu geben, weil es sehr viele verschiedene Möglichkeiten dafür gibt. Und weil wir nicht wissen, was verwendet werden soll bzw. was zum anderen Programm dazupasst (wo es dann eingebaut werden soll).

Daher ...
a) Vielleicht ist der Teil für dich ja kein Problem? Kannst du ein Programm mit einer Tabelle, ohne bestimmten Inhalt, ohne Hilfe erstellen?
b) Wenn nicht, wie ist es mit einem Programm ohne Tabelle, aber zumindest mit sichtbarem Fenster? Wenn das geht und wir den Code sehen dann wissen wir auch besser, wie es weitergehen soll.
c) Sonst ... je nach dem was du schon weißt, bitte so viel Hinweise wie möglich damit wir erkennen können, wie die graphische Oberfläche aufgebaut werden soll.
 
@sheel
Danke Schon mal.


Ich bin noch nicht zur Erstellung von dem Programm gekommen. Was ich machen möchte ist:
Eine Methode der übergebe ich einen String.
Der String enthält den Pfad zur ical-Datei.
Dann liest die Methode die Datei und liefert eine liste mit Datums werte.

Mein Problem geht schon los wie ich die ical-Datei einlese. Wie ich txt-Dateien lese ist mir bewusst aber der Rest nicht.
Was ich nicht beachten muss ist, dass das Programm was ich mache nicht so verwendet wird um ins andere Programm reinzubauen. Sie wollen nur mir aufgaben geben.
Nur doof wenn ich schon bei der ersten scheitere.
 
Wikipedia hat ein ainfaches Beispiel so einer Datei:
Code:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
BEGIN:VEVENT
UID:uid1@example.com
DTSTAMP:19970714T170000Z
ORGANIZER:CN=John Doe:MAILTO:john.doe@example.com
DTSTART:19970714T170000Z
DTEND:19970715T035959Z
SUMMARY:Bastille Day Party
END:VEVENT
END:VCALENDAR
Ist also auch nur eine Textdatei.

Wenn du die Datei Zeile für Zeile einliest...

BEGIN:VCALENDAR und END:VCALENDAR markieren den "Kalender", der dann mehrere Tage eingetragen hat.
Da theoretisch außerhalb dieser Sektion auch was sein kann (zumindest eine leere Zeile am Schluss oder ähnliches, könnte man zB. außerhalb der Schleife eine Variable machen, ob man gerade "in" dem Kalender oder außerhalb ist. Anfangswert ist außerhalb (zB. false für ein bool inCalendar).
In der Schleife, wo je eine Zeile eingelesen wird, hänt es dann von der Variable ab, was man mit der Zeile macht:
Wenn man nicht im Kalender ist, prüfen ob die Zeile BEGIN:VEVENT ist. Wenn ja, die Variable auf "drinnen" setzen, weil es eben ab hier drinnen ist. Sonst, einfach nichts tun und den nächsten Schleifendurchgang die nächste Zeile lesen lassen.
Wenn man gerade im Kalender ist: Wenn END:VCALENDAR dann die Variable wieder auf draußen setzen, sonst (vorerst) nichts.

Bisher weiß man dann immerhin, wo der Kalender anfängt und aufhört.

Der Kalender hat dann innen so Zeug wie VERSION, und ein oder mehrere VEVENTs - wieder mit BEGIN und END. Da kann man den bestehenden Code gleich erweitern - die Variable ist dann nicht nur "außerhalb" oder "im Kalender", sondern "gand draußen", "im Kalender aber nicht in einem Event", und "in einem Event". Wieder mit dem Erkennen von Beginn und Ende von Events, aber die nur wenn man schon im Kalender ist.

Was man dann im Event macht später - sind bis hierhin einmal Fragen/Probleme?
 
Wieso setzt du nicht eine fertige Bibliothek ein? Es gibt ganz bestimmt ical Bibliotheken für .NET.
 
Hey Leute,
ich hätte noch mal eine Frage zu dem Thema. Unten seht Ihr mein Code in C# der auch fast fertig ist. Jetzt soll ich allerdings alles in eine Klasse packen mit den Eigenschaften Startdatum, Enddatum, Summary und Description. Code soll ausgelagert werden in eine Methode die im Eingang Pfad übernimmt und Return die Liste meiner Klasse Liefert.

Ich hab kein schimmer wie man da jetzt eine Klasse draus mache geschweigendem von dem anderen Zeug.
Ich sag jetzt schon mal Vielen Lieben Dank an alle !





C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ConsoleApp1
{
    class Program
    {
        private static string EVENTSTART_TOKEN = "BEGIN:VEVENT";
        private static string EVENTEND_TOKEN = "END:VEVENT";
        private static string STARTDATE_TOKEN = "DTSTART;";
        private static string ENDDATE_TOKEN = "DTEND;";
        private static string VALUE_TOKE = "VALUE=DATE:";
        private static string VALUE_SUMMARY = "SUMMARY:";
        private static string VALUE_DESCRIPTION = "DESCRIPTION:";

  
        static void Main(string[] args)
        {
            string all = File.ReadAllText(@".................................................................................");

            char[] delim = { '\n', };                            
            string[] lines = all.Split(delim, StringSplitOptions.RemoveEmptyEntries);
          
            bool inEvent = false;

            int startTimeStamp = 0;
            int endTimeStamp = 0;
            string summary = String.Empty;
            string description = String.Empty;


            for (int i = 0; i < lines.Length; i++)
            {
                if (lines[i].StartsWith(EVENTSTART_TOKEN))
                    inEvent = true;
                else if (lines[i].StartsWith(EVENTEND_TOKEN))
                {
                    Console.WriteLine($"Event Name {summary}, Description: {description}: {startTimeStamp} - {endTimeStamp}");
                    inEvent = false;
                }
                else if (inEvent)
                {
                    if (lines[i].StartsWith(STARTDATE_TOKEN))
                    {
                        startTimeStamp = Int32.Parse(lines[i].Replace(STARTDATE_TOKEN, string.Empty).Replace(VALUE_TOKE, String.Empty));

                    }
                    if (lines[i].StartsWith(ENDDATE_TOKEN))
                    {
                        endTimeStamp = Int32.Parse(lines[i].Replace(ENDDATE_TOKEN, string.Empty).Replace(VALUE_TOKE, String.Empty));
                    }
                    if (lines[i].StartsWith(VALUE_SUMMARY))
                    {
                        summary = lines[i].Replace(VALUE_SUMMARY, string.Empty).Replace("\r", String.Empty);

                    }
                    if (lines[i].StartsWith(VALUE_DESCRIPTION))
                    {
                        description = lines[i].Replace(VALUE_DESCRIPTION, string.Empty);
                        while(i + 1 < lines.Length && lines[i + 1].StartsWith(" "))
                        {
                            // Es muss eine weitere Zeile geben
                            i++;
                            description += lines[i].Substring(1);
                        }
                    }

                }
            }
            Console.ReadLine();
        }

    }
}
 
Zurück