Ich parse für eine Kalenderapp, die ich entwickle, ics-Dateien. Ich tue dies wie folgt:
string[] lines = content.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries);
string summary = lines[8]; //SUMMARY
string start = lines[18].Split(':')[1]; //START-ZEITPUNKT
string end = lines[20].Split(':')[1]; //END-ZEITPUNKT
Nun meine Frage: Funktioniert das immer? Gibt es da eine elegantere Methode, die "SUMMARY" sowie den Start- und den Endzeitpunkt herauszuziehen?
Anstatt dich auf die Reihenfolge und Vollständigkeit der Daten zu verlassen, solltest du besser die Daten vernünftig parsen.
Wenn du nur die von dir erwähnten 3 Einträge benötigst, reicht aber auch
string summary, start, end;
foreach (string line in lines)
{
string s;
if (TryReadLine(line, "SUMMARY:", out s))
summary = s;
if (TryReadLine(line, "DTSTART:", out s))
start = s;
if (TryReadLine(line, "DTEND:", out s))
end = s;
}
mit der Hilfsmethode
bool TryReadLine(string line, string keyword, out string value)
{
if (line.StartsWith(keyword))
{
value = line.Substr(keyword.Length);
return true;
}
value = String.Empty; // edited
return false;
}
Da ich das ICS-Format bisher nicht kannte, habe ich mich an ICalendar orientiert.
PS: Noch schöner könnte man den ersten Code mit einem Array (bzw. List
) machen.
Vielen Dank, das funktioniert - nur musste ich in der TryReadLine-Methode dem string value einen Leerstring zuweisen, d. h. value = "".
Stimmt, sonst kompiliert es nicht, da dies ein out
-Parameter ist.
Hat die Blume einen Knick, war der Schmetterling zu dick.