public Operation Parse(string[] lines) { Operation operation = new Operation(); lines = Utilities.Trim(lines); for (int i = 0; i < lines.Length; i++) { try { var line = lines[i]; if (line.Length == 0) { continue; } string msg = line; string keyword; if (ParserUtility.StartsWithKeyword(line, Keywords, out keyword)) { msg = ParserUtility.GetMessageText(line, keyword); } if (!string.IsNullOrWhiteSpace(keyword)) { switch (keyword.ToUpperInvariant()) { case "ALARMSTICHWORT": operation.Keywords.Keyword = msg; break; case "EINSATZORT": string street, streetNumber, appendix; ParserUtility.AnalyzeStreetLine(msg, out street, out streetNumber, out appendix); operation.CustomData["Einsatzort Zusatz"] = appendix; operation.Einsatzort.Street = street; operation.Einsatzort.StreetNumber = streetNumber; break; case "ORT": operation.Einsatzort.City = msg; break; case "ORTSTEIL": operation.CustomData["Einsatzort Ortsteil"] = msg; break; case "OBJEKT": operation.Einsatzort.Property = msg; break; } } else { operation.Comment = operation.Comment.AppendLine(line); } } catch (Exception ex) { } } return(null); }
Operation IParser.Parse(string[] lines) { Operation operation = new Operation(); OperationResource last = new OperationResource(); lines = Utilities.Trim(lines); CurrentSection section = CurrentSection.AHeader; bool keywordsOnly = true; for (int i = 0; i < lines.Length; i++) { try { string line = lines[i]; if (line.Length == 0) { continue; } if (GetSection(line.Trim(), ref section, ref keywordsOnly)) { continue; } string msg = line; string prefix = ""; // Make the keyword check - or not (depends on the section we are in; see above) if (keywordsOnly) { string keyword; if (!ParserUtility.StartsWithKeyword(line, Keywords, out keyword)) { continue; } int x = line.IndexOf(':'); if (x == -1) { // If there is no colon found (may happen occasionally) then simply remove the length of the keyword from the beginning prefix = keyword; msg = line.Remove(0, prefix.Length).Trim(); } else { prefix = line.Substring(0, x); msg = line.Substring(x + 1).Trim(); } prefix = prefix.Trim().ToUpperInvariant(); } // Parse each section switch (section) { case CurrentSection.AHeader: { switch (prefix) { case "ABSENDER": operation.CustomData["Absender"] = msg; break; case "EINSATZNUMMER": operation.OperationNumber = ParserUtility.GetTextBetween(msg, null, "Alarmzeit:"); string timestamp = ParserUtility.GetTextBetween(msg, "Alarmzeit:"); operation.Timestamp = ParserUtility.ReadFaxTimestamp(timestamp, DateTime.Now); break; } } break; case CurrentSection.BMitteiler: { // This switch would not be necessary in this section (there is only "Name")... switch (prefix) { case "NAME": operation.Messenger = msg; break; case "TELEFON": operation.Messenger = string.Format("{0} Telefon: {1}", operation.Messenger, msg); break; } } break; case CurrentSection.CEinsatzort: { switch (prefix) { case "STRAßE": { string street, streetNumber, appendix; ParserUtility.AnalyzeStreetLine(msg, out street, out streetNumber, out appendix); operation.CustomData["Einsatzort Zusatz"] = appendix; operation.Einsatzort.Street = street; operation.Einsatzort.StreetNumber = streetNumber; } break; case "ABSCHNITT": operation.CustomData["Einsatzort Abschnitt"] = msg; break; case "ORT": { operation.Einsatzort.ZipCode = ParserUtility.ReadZipCodeFromCity(msg); if (string.IsNullOrWhiteSpace(operation.Einsatzort.ZipCode)) { Logger.Instance.LogFormat(LogType.Warning, this, "Could not find a zip code for city '{0}'. Route planning may fail or yield wrong results!", operation.Einsatzort.City); } operation.Einsatzort.City = msg.Remove(0, operation.Einsatzort.ZipCode.Length).Trim(); // The City-text often contains a dash after which the administrative city appears multiple times (like "City A - City A City A"). // However we can (at least with google maps) omit this information without problems! int dashIndex = operation.Einsatzort.City.IndexOf(" - "); if (dashIndex != -1) { // Ignore everything after the dash operation.Einsatzort.City = operation.Einsatzort.City.Substring(0, dashIndex).Trim(); } } break; case "OBJEKT": operation.Einsatzort.Property = msg; break; case "KREUZUNG": operation.Einsatzort.Intersection = msg; break; case "STATION": operation.CustomData["Einsatzort Station"] = ParserUtility.GetTextBetween(msg, null, "Objektnummer"); operation.OperationPlan = ParserUtility.GetMessageText(ParserUtility.GetTextBetween(msg, "Objektnummer"), ""); break; } } break; case CurrentSection.DEinsatzgrund: { switch (prefix) { case "SCHLAGWORT.": operation.Keywords.Keyword = msg; break; case "- BRAND": operation.Keywords.B = msg; break; case "- RETTUNGSDIENST": operation.Keywords.R = msg; break; case "- SONSTIGES": operation.Keywords.S = msg; break; case "- THL": operation.Keywords.T = msg; break; case "- INFO": operation.CustomData["Stichwort I"] = msg; break; } } break; case CurrentSection.EEinsatzmittel: { switch (prefix) { case "EINSATZMITTELNAME": last.FullName = msg; break; case "GEF. GERÄTE": last.RequestedEquipment.Add(msg); operation.Resources.Add(last); last = new OperationResource(); break; } } break; case CurrentSection.FBemerkung: { // Append with newline at the end in case that the message spans more than one line operation.Comment = operation.Comment.AppendLine(msg); } break; case CurrentSection.GFooter: // The footer can be ignored completely. break; } } catch (Exception ex) { Logger.Instance.LogFormat(LogType.Warning, this, "Error while parsing line '{0}'. The error message was: {1}", i, ex.Message); } } return(operation); }
Operation IParser.Parse(string[] lines) { Operation operation = new Operation(); lines = Utilities.Trim(lines); foreach (var line in lines) { if (ParserUtility.StartsWithKeyword(line, _keywords, out var keyword)) { var msg = ParserUtility.GetMessageText(line, keyword); switch (keyword.ToUpperInvariant()) { case "EINSATZNUMMER": { operation.OperationNumber = msg; break; } case "ORT:": { operation.Einsatzort.City = msg; break; } case "STRAßE": { string street; string streetNumber; string appendix; ParserUtility.AnalyzeStreetLine(msg, out street, out streetNumber, out appendix); operation.CustomData["Einsatzort Zusatz"] = appendix; operation.Einsatzort.Street = street; operation.Einsatzort.StreetNumber = streetNumber; break; } case "OBJEKT": { operation.Einsatzort.Property = msg; break; } case "BEMERKUNG": { operation.Comment = msg; break; } case "KOORDINATEN": { if (_coordinatenRegex.IsMatch(msg)) { Match m = _coordinatenRegex.Match(msg); operation.Einsatzort.GeoLatitude = Convert.ToDouble(m.Groups[1].Value, CultureInfo.InvariantCulture); operation.Einsatzort.GeoLongitude = Convert.ToDouble(m.Groups[2].Value, CultureInfo.InvariantCulture); } break; } case "EINSATZANLASS": { operation.Keywords.EmergencyKeyword = msg; break; } case "MELDEBILD": { operation.Picture = msg; break; } case "ZIELORT": { break; } case "ZEITEN": { break; } case "EM": { Match alarm = Regex.Match(line, @"[1-9]{1,2}-[1-9]{2}-[1-9]{1}"); if (alarm.Success) { operation.Resources.Add(new OperationResource { FullName = alarm.Groups[0].Value }); } break; } } } } return(operation); }
Operation IParser.Parse(string[] lines) { Operation operation = new Operation(); CurrentSection section = CurrentSection.AAnfang; lines = Utilities.Trim(lines); foreach (string line in lines) { string keyword; if (ParserUtility.StartsWithKeyword(line, _keywords, out keyword)) { switch (keyword) { case "Ort ": { section = CurrentSection.BOrt; break; } case "Ortsteil": { section = CurrentSection.COrtsteil; break; } case "Straße": { section = CurrentSection.DStraße; break; } case "Hausnummer": { section = CurrentSection.EHausnummer; break; } case "Koordinaten ": { section = CurrentSection.FKoordinaten; break; } case "Zusatzinfos": { section = CurrentSection.GZusatzinfos; break; } case "Betroffene": { section = CurrentSection.HBetroffene; break; } case "Einsatzart": { section = CurrentSection.IEinsatzart; break; } case "Stichwort": { section = CurrentSection.JStichwort; break; } case "Sondersignal": { section = CurrentSection.KSondersignal; break; } case "Zusatzinformationen": { section = CurrentSection.LZusatzinformationen; break; } case "Alarmierungen": { section = CurrentSection.MAlarmierungen; break; } case "Meldende": { section = CurrentSection.NMeldende; break; } case "Telefon": { section = CurrentSection.OTelefon; break; } case "Ausdruck": { section = CurrentSection.PAusdruck; break; } case "Referenznummer": { section = CurrentSection.QReferenznummer; break; } } } switch (section) { case CurrentSection.AAnfang: { break; } case CurrentSection.BOrt: { operation.Einsatzort.City = ParserUtility.GetMessageText(line); break; } case CurrentSection.COrtsteil: { operation.Einsatzort.City += " " + ParserUtility.GetMessageText(line); break; } case CurrentSection.DStraße: { operation.Einsatzort.Street = ParserUtility.GetMessageText(line); break; } case CurrentSection.EHausnummer: { operation.Einsatzort.StreetNumber = ParserUtility.GetMessageText(line); break; } case CurrentSection.FKoordinaten: { break; } case CurrentSection.GZusatzinfos: { operation.Comment = ParserUtility.GetMessageText(line); break; } case CurrentSection.HBetroffene: { operation.Comment += " " + ParserUtility.GetMessageText(line); section = CurrentSection.AAnfang; break; } case CurrentSection.IEinsatzart: { operation.Keywords.EmergencyKeyword = ParserUtility.GetMessageText(line); break; } case CurrentSection.JStichwort: { operation.Keywords.Keyword = ParserUtility.GetMessageText(line); break; } case CurrentSection.KSondersignal: { break; } case CurrentSection.LZusatzinformationen: { operation.Picture = ParserUtility.GetMessageText(line); section = CurrentSection.AAnfang; break; } case CurrentSection.MAlarmierungen: { Match alarm = Regex.Match(line, @"((0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d ([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]) (\d{5})"); if (alarm.Success) { operation.Resources.Add(new OperationResource { FullName = alarm.Groups[6].Value, Timestamp = alarm.Groups[1].Value }); } break; } case CurrentSection.NMeldende: { operation.Messenger = ParserUtility.GetMessageText(line); break; } case CurrentSection.OTelefon: { operation.Messenger += string.Format(@" Tel.:{0}", ParserUtility.GetMessageText(line)); break; } case CurrentSection.PAusdruck: { operation.Timestamp = ParserUtility.ReadFaxTimestamp(line, DateTime.Now); break; } case CurrentSection.QReferenznummer: { operation.OperationNumber = ParserUtility.GetMessageText(line); break; } case CurrentSection.REnde: { break; } } } return(operation); }
Operation IParser.Parse(string[] lines) { Operation operation = new Operation(); CurrentSection section = CurrentSection.Anfang; lines = Utilities.Trim(lines); string streetData = string.Empty; string sectionData = string.Empty; foreach (var line in lines) { string keyword; if (ParserUtility.StartsWithKeyword(line, _keywords, out keyword)) { switch (keyword.Trim()) { case "E-Nr": { section = CurrentSection.ENr; break; } case "EINSATZORT": { section = CurrentSection.Einsatzort; break; } case "STRAßE": { section = CurrentSection.Straße; break; } case "ABSCHNITT": { section = CurrentSection.Abschnitt; break; } case "KOORDINATEN": { section = CurrentSection.Koordinaten; break; } case "ORTSTEIL/ORT": case "ORTSTEIL / ORT": { section = CurrentSection.Ort; break; } case "OBJEKT": { section = CurrentSection.Objekt; break; } case "EINSATZPLAN": { section = CurrentSection.Einsatzplan; break; } case "MELDEBILD": { section = CurrentSection.Meldebild; break; } case "EINSATZSTICHWORT": { section = CurrentSection.Einsatzstichwort; break; } case "HINWEIS": { section = CurrentSection.Hinweis; break; } case "EINSATZMITTEL": { section = CurrentSection.Einsatzmittel; break; } case "(ALARMSCHREIBEN ENDE)": { section = CurrentSection.Ende; break; } } } switch (section) { case CurrentSection.ENr: string opnummer = ParserUtility.GetTextBetween(line, null, "ALARM"); string optime = ParserUtility.GetTextBetween(line, "ALARM"); operation.OperationNumber = ParserUtility.GetMessageText(opnummer, keyword); operation.Timestamp = ParserUtility.ReadFaxTimestamp(optime, DateTime.Now); break; case CurrentSection.Einsatzort: operation.Zielort.Location = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.Straße: string msg = ParserUtility.GetMessageText(line, keyword); streetData += msg; break; case CurrentSection.Abschnitt: sectionData += ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.Ort: operation.Einsatzort.City = ParserUtility.GetMessageText(line, keyword); if (operation.Einsatzort.City.Contains(" - ")) { int i = operation.Einsatzort.City.IndexOf(" - "); operation.Einsatzort.City = operation.Einsatzort.City.Substring(0, i).Trim(); } break; case CurrentSection.Objekt: operation.Einsatzort.Property += ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.Einsatzplan: operation.OperationPlan = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.Meldebild: operation.Picture = operation.Picture.AppendLine(ParserUtility.GetMessageText(line, keyword)); break; case CurrentSection.Einsatzstichwort: operation.Keywords.EmergencyKeyword = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.Hinweis: operation.Comment = operation.Comment.AppendLine(ParserUtility.GetMessageText(line, keyword)); break; case CurrentSection.Einsatzmittel: if (line.Equals("EINSATZMITTEL: ", StringComparison.InvariantCultureIgnoreCase)) { break; } OperationResource resource = new OperationResource(); if (line.Contains('(')) { string tool = line.Substring(line.IndexOf("(", StringComparison.Ordinal) + 1); tool = tool.Length >= 2 ? tool.Substring(0, tool.Length - 2).Trim() : String.Empty; string unit = line.Substring(0, line.IndexOf("(", StringComparison.Ordinal)); resource.FullName = unit; resource.RequestedEquipment.Add(tool); operation.Resources.Add(resource); } break; case CurrentSection.Koordinaten: string coords = ParserUtility.GetMessageText(line, keyword); if (string.IsNullOrWhiteSpace(coords)) { break; } double east = double.Parse(coords.Split('/')[0], CultureInfo.InvariantCulture); double north = double.Parse(coords.Split('/')[1], CultureInfo.InvariantCulture); var geo = GeographicCoords.FromGaussKrueger(east, north); operation.Einsatzort.GeoLatitude = geo.Latitude; operation.Einsatzort.GeoLongitude = geo.Longitude; break; case CurrentSection.Ende: break; } } string street, streetNumber, appendix; ParserUtility.AnalyzeStreetLine(streetData.Replace("1.2", ""), out street, out streetNumber, out appendix); operation.CustomData["Einsatzort Zusatz"] = appendix; operation.Einsatzort.Street = street.Trim(); operation.Einsatzort.StreetNumber = streetNumber; operation.Einsatzort.Intersection = sectionData; return(operation); }
Operation IParser.Parse(string[] lines) { Operation operation = new Operation(); OperationResource last = new OperationResource(); lines = Utilities.Trim(lines); CurrentSection section = CurrentSection.AHeader; bool keywordsOnly = true; InnerSection innerSection = InnerSection.AStraße; for (int i = 0; i < lines.Length; i++) { try { string line = lines[i]; if (line.Length == 0) { continue; } // Try to parse the header and extract date and time if possible operation.Timestamp = ParserUtility.ReadFaxTimestamp(line, operation.Timestamp); if (GetSection(line.Trim(), ref section, ref keywordsOnly)) { continue; } string msg = line; string prefix = ""; // Make the keyword check - or not (depends on the section we are in; see above) if (keywordsOnly) { string keyword; if (!ParserUtility.StartsWithKeyword(line, Keywords, out keyword)) { continue; } int x = line.IndexOf(':'); if (x == -1) { // If there is no colon found (may happen occasionally) then simply remove the length of the keyword from the beginning prefix = keyword; msg = line.Remove(0, prefix.Length).Trim(); } else { prefix = line.Substring(0, x); msg = line.Substring(x + 1).Trim(); } prefix = prefix.Trim().ToUpperInvariant(); } // Parse each section switch (section) { case CurrentSection.AHeader: { switch (prefix) { case "ABSENDER": operation.CustomData["Absender"] = msg; break; case "TERMIN": operation.CustomData["Termin"] = msg; break; case "EINSATZNUMMER": operation.OperationNumber = msg; break; case "BMA MELDER": operation.CustomData["BMA Melder"] = msg; break; } } break; case CurrentSection.BMitteiler: { // This switch would not be necessary in this section (there is only "Name")... switch (prefix) { case "NAME": operation.Messenger = msg; break; } } break; case CurrentSection.CEinsatzort: { switch (prefix) { case "STRAßE": { innerSection = InnerSection.AStraße; string street, streetNumber, appendix; ParserUtility.AnalyzeStreetLine(msg, out street, out streetNumber, out appendix); operation.CustomData["Einsatzort Zusatz"] = appendix; operation.Einsatzort.Street = street; operation.Einsatzort.StreetNumber = streetNumber; } break; case "STR.ABSCHN": innerSection = InnerSection.BAbschnitt; operation.CustomData["Einsatzort Straße Abschnitt"] = msg; break; case "ORT": { innerSection = InnerSection.COrt; operation.Einsatzort.ZipCode = ParserUtility.ReadZipCodeFromCity(msg); if (string.IsNullOrWhiteSpace(operation.Einsatzort.ZipCode)) { Logger.Instance.LogFormat(LogType.Warning, this, "Could not find a zip code for city '{0}'. Route planning may fail or yield wrong results!", operation.Einsatzort.City); } operation.Einsatzort.City = msg.Remove(0, operation.Einsatzort.ZipCode.Length).Trim(); // The City-text often contains a dash after which the administrative city appears multiple times (like "City A - City A City A"). // However we can (at least with google maps) omit this information without problems! int dashIndex = operation.Einsatzort.City.IndexOf(" - "); if (dashIndex != -1) { // Ignore everything after the dash operation.Einsatzort.City = operation.Einsatzort.City.Substring(0, dashIndex).Trim(); } } break; case "OBJEKT": innerSection = InnerSection.DObjekt; operation.Einsatzort.Property = msg; break; case "STATION": innerSection = InnerSection.EStation; operation.CustomData["Einsatzort Station"] = msg; break; default: switch (innerSection) { case InnerSection.AStraße: //Quite dirty because of Streetnumber. Looking for better solution operation.Einsatzort.Street += msg; break; case InnerSection.BAbschnitt: operation.CustomData["Einsatzort Straße Abschnitt"] += msg; break; case InnerSection.COrt: operation.Einsatzort.City += msg; break; case InnerSection.DObjekt: operation.Einsatzort.Property += msg; break; case InnerSection.EStation: operation.CustomData["Einsatzort Station"] += msg; break; } break; } } break; case CurrentSection.EEinsatzgrund: { switch (prefix) { case "SCHLAGW.": operation.Keywords.Keyword = msg; break; case "STICHWORT B": operation.Keywords.B = msg; break; case "STICHWORT T": operation.Keywords.T = msg; break; case "STICHWORT S": operation.Keywords.S = msg; break; case "STICHWORT R": operation.Keywords.R = msg; break; } } break; case CurrentSection.FEinsatzmittel: { if (line.StartsWith("NAME", StringComparison.CurrentCultureIgnoreCase)) { msg = ParserUtility.GetMessageText(line, "NAME"); last.FullName = msg.Trim(); } else if (line.StartsWith("GEF. GERÄT", StringComparison.CurrentCultureIgnoreCase)) { msg = ParserUtility.GetMessageText(line, "GEF. GERÄT"); // Only add to requested equipment if there is some text, // otherwise the whole vehicle is the requested equipment if (!string.IsNullOrWhiteSpace(msg)) { last.RequestedEquipment.Add(msg); } } else if (line.StartsWith("ALARMIERT", StringComparison.CurrentCultureIgnoreCase)) { msg = ParserUtility.GetMessageText(line, "Alarmiert"); // In case that parsing the time failed, we just assume that the resource got requested right away. DateTime dt; // Most of the time the OCR-software reads the colon as a "1", so we check this case right here. if (!DateTime.TryParseExact(msg, "dd.MM.yyyy HH1mm", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt)) { // If this is NOT the case and it was parsed correctly, try it here DateTime.TryParseExact(msg, "dd.MM.yyyy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt); } last.Timestamp = dt.ToString("dd.MM.yyyy HH:mm"); // This line will end the construction of this resource. Add it to the list and go to the next. operation.Resources.Add(last); last = new OperationResource(); } } break; case CurrentSection.GBemerkung: { // Append with newline at the end in case that the message spans more than one line operation.Comment = operation.Comment.AppendLine(msg); } break; case CurrentSection.HFooter: // The footer can be ignored completely. break; } } catch (Exception ex) { Logger.Instance.LogFormat(LogType.Warning, this, "Error while parsing line '{0}'. The error message was: {1}", i, ex.Message); } } return(operation); }
Operation IParser.Parse(string[] lines) { Operation operation = new Operation(); CurrentSection section = CurrentSection.AAnfang; lines = Utilities.Trim(lines); foreach (string line in lines) { string keyword; string messageText = line; if (ParserUtility.StartsWithKeyword(line, _keywords, out keyword)) { switch (keyword) { case "Einsatzdepeche": { section = CurrentSection.AAnfang; break; } case "AAO": { section = CurrentSection.BAao; break; } case "Einsatzort": { section = CurrentSection.CEinsatzort; break; } case "Strasse": { section = CurrentSection.DStrasse; break; } case "Ort": { section = CurrentSection.EOrt; break; } case "Objekt": { section = CurrentSection.FObjekt; break; } case "Wer": { section = CurrentSection.GMeldender; break; } case "Was": { section = CurrentSection.HSchlagwort; break; } case "Wo": { section = CurrentSection.JZusatzinfo; break; } case "Einsatzplan": { section = CurrentSection.KEinsatzplan; break; } case "Hinweistext": { section = CurrentSection.LHinweis; break; } case "Einheiten": { section = CurrentSection.MEinheiten; break; } } if (section == CurrentSection.GMeldender || section == CurrentSection.HSchlagwort || section == CurrentSection.JZusatzinfo || section == CurrentSection.MEinheiten) { section = CurrentSection.ZEnde; } messageText = ParserUtility.GetMessageText(line, keyword); } switch (section) { case CurrentSection.AAnfang: { operation.OperationNumber = ParserUtility.GetTextBetween(messageText, null, "am:", StringComparison.InvariantCulture); string textBeteween = ParserUtility.GetTextBetween(messageText, "am:", "um", StringComparison.InvariantCulture); operation.Timestamp = ParserUtility.ReadFaxTimestamp(textBeteween, DateTime.Now); break; } case CurrentSection.BAao: { operation.Keywords.Keyword = messageText; break; } case CurrentSection.CEinsatzort: { operation.Einsatzort.Location = messageText; break; } case CurrentSection.DStrasse: { string street, streetNumber, appendix; ParserUtility.AnalyzeStreetLine(messageText, out street, out streetNumber, out appendix); operation.Einsatzort.Street = street; operation.Einsatzort.StreetNumber = streetNumber; operation.CustomData["Einsatzort Zusatz"] = appendix; break; } case CurrentSection.EOrt: { operation.Einsatzort.City = messageText; break; } case CurrentSection.FObjekt: { operation.Einsatzort.Property = messageText; break; } case CurrentSection.GMeldender: { operation.Messenger = messageText + Environment.NewLine; break; } case CurrentSection.HSchlagwort: { operation.Keywords.EmergencyKeyword = messageText; break; } case CurrentSection.JZusatzinfo: { operation.Picture = messageText + Environment.NewLine; break; } case CurrentSection.KEinsatzplan: { operation.OperationPlan = messageText; break; } case CurrentSection.LHinweis: { operation.Comment = messageText + Environment.NewLine; break; } case CurrentSection.MEinheiten: { Match match = Regex.Match(messageText, "<(.*)>"); if (match.Success) { string value = match.Groups[1].Value; OperationResource operationResource = new OperationResource(); operationResource.FullName = value; operation.Resources.Add(operationResource); } break; } } } operation.Comment = ParserUtility.RemoveTrailingNewline(operation.Comment); operation.Picture = ParserUtility.RemoveTrailingNewline(operation.Picture); operation.Messenger = ParserUtility.RemoveTrailingNewline(operation.Messenger); return(operation); }
Operation IParser.Parse(string[] lines) { Operation operation = new Operation(); OperationResource last = new OperationResource(); lines = Utilities.Trim(lines); CurrentSection section = CurrentSection.AHeader; bool keywordsOnly = true; for (int i = 0; i < lines.Length; i++) { try { string line = lines[i]; if (line.Length == 0) { continue; } operation.Timestamp = ParserUtility.ReadFaxTimestamp(line, operation.Timestamp); if (GetSection(line.Trim(), ref section, ref keywordsOnly)) { continue; } string msg = line; string prefix = ""; string keyword = null; if (keywordsOnly) { if (!ParserUtility.StartsWithKeyword(line, Keywords, out keyword)) { continue; } int x = line.IndexOf(':'); if (x == -1) { prefix = keyword; msg = line.Remove(0, prefix.Length).Trim(); } else { prefix = line.Substring(0, x); msg = line.Substring(x + 1).Trim(); } prefix = prefix.Trim().ToUpperInvariant(); } switch (section) { case CurrentSection.AHeader: { switch (prefix) { case "ABSENDER": operation.CustomData["Absender"] = msg; break; case "TERMIN": operation.CustomData["Termin"] = msg; break; case "EINSATZNUMMER": operation.OperationNumber = msg; break; default: break; } } break; case CurrentSection.BMitteiler: { // This switch would not be necessary in this section (there is only "Name")... switch (prefix) { case "NAME": operation.Messenger = msg; break; default: break; } } break; case CurrentSection.CEinsatzort: { switch (prefix) { case "STRAßE": { string street, streetNumber, appendix; ParserUtility.AnalyzeStreetLine(msg, out street, out streetNumber, out appendix); operation.CustomData["Einsatzort Zusatz"] = appendix; operation.Einsatzort.Street = street; operation.Einsatzort.StreetNumber = streetNumber; } break; case "ORT": { operation.Einsatzort.ZipCode = ParserUtility.ReadZipCodeFromCity(msg); if (string.IsNullOrWhiteSpace(operation.Einsatzort.ZipCode)) { Logger.Instance.LogFormat(LogType.Warning, this, "Could not find a zip code for city '{0}'. Route planning may fail or yield wrong results!", operation.Einsatzort.City); } operation.Einsatzort.City = msg.Remove(0, operation.Einsatzort.ZipCode.Length).Trim(); // The City-text often contains a dash after which the administrative city appears multiple times (like "City A - City A City A"). // However we can (at least with google maps) omit this information without problems! int dashIndex = operation.Einsatzort.City.IndexOf(" - "); if (dashIndex != -1) { // Ignore everything after the dash operation.Einsatzort.City = operation.Einsatzort.City.Substring(0, dashIndex); } } break; case "OBJEKT": operation.Einsatzort.Property = msg; break; case "PLANNUMMER": operation.CustomData["Einsatzort Plannummer"] = msg; break; case "STATION": operation.CustomData["Einsatzort Station"] = msg; break; default: break; } } break; case CurrentSection.DZielort: { switch (prefix) { case "STRAßE": { string street, streetNumber, appendix; ParserUtility.AnalyzeStreetLine(msg, out street, out streetNumber, out appendix); operation.CustomData["Zielort Zusatz"] = appendix; operation.Zielort.Street = street; operation.Zielort.StreetNumber = streetNumber; } break; case "ORT": { string plz = ParserUtility.ReadZipCodeFromCity(msg); operation.Zielort.ZipCode = plz; operation.Zielort.City = msg.Remove(0, plz.Length).Trim(); } break; case "OBJEKT": operation.Zielort.Property = msg; break; case "STATION": operation.CustomData["Zielort Station"] = msg; break; default: break; } } break; case CurrentSection.EEinsatzgrund: { switch (prefix) { case "SCHLAGW.": operation.Keywords.Keyword = msg; break; case "STICHWORT B": operation.Keywords.B = msg; break; case "STICHWORT R": operation.Keywords.R = msg; break; case "STICHWORT S": operation.Keywords.S = msg; break; case "STICHWORT T": operation.Keywords.T = msg; break; case "PRIO.": operation.Priority = msg; break; default: break; } } break; case CurrentSection.FEinsatzmittel: { if (line.StartsWith("EINSATZMITTEL", StringComparison.CurrentCultureIgnoreCase)) { msg = ParserUtility.GetMessageText(line, "EINSATZMITTEL"); last.FullName = msg; } else if (line.StartsWith("ALARMIERT", StringComparison.CurrentCultureIgnoreCase) && !string.IsNullOrEmpty(msg)) { msg = ParserUtility.GetMessageText(line, "Alarmiert"); DateTime dt = ParserUtility.TryGetTimestampFromMessage(msg, operation.Timestamp); last.Timestamp = dt.ToString(); } else if (line.StartsWith("GEFORDERTE AUSSTATTUNG", StringComparison.CurrentCultureIgnoreCase)) { msg = ParserUtility.GetMessageText(line, "Geforderte Ausstattung"); if (!string.IsNullOrWhiteSpace(msg)) { last.RequestedEquipment.Add(msg); } operation.Resources.Add(last); last = new OperationResource(); } } break; case CurrentSection.GBemerkung: { operation.Comment = operation.Comment += msg + "\n"; } break; case CurrentSection.HFooter: // The footer can be ignored completely. break; default: break; } } catch (Exception ex) { Logger.Instance.LogFormat(LogType.Warning, this, "Error while parsing line '{0}'. The error message was: {1}", i, ex.Message); } } operation.Comment = ParserUtility.RemoveTrailingNewline(operation.Comment); return(operation); }
public Operation Parse(string[] lines) { Operation operation = new Operation(); string date = ""; foreach (string line in lines) { string keyword; ParserUtility.StartsWithKeyword(line, _keywords, out keyword); string msg = ParserUtility.GetMessageText(line, keyword); switch (keyword) { case "Datum": date = msg; break; case "Zeit": string time = msg; operation.Timestamp = ParserUtility.ReadFaxTimestamp(string.Format("{0} {1}", date, time), DateTime.Now); break; case "Feuerwehr": operation.CustomData["Feuerwehr"] = msg; break; case "Alarmstufe": operation.Keywords.EmergencyKeyword = msg; break; case "Bezeichnung": operation.Keywords.Keyword = msg; break; case "Strasse": operation.Einsatzort.Street = msg; break; case "Strasse Nr.": operation.Einsatzort.StreetNumber = msg; break; case "PLZ": operation.Einsatzort.ZipCode = msg; break; case "Ort": operation.Einsatzort.City = msg; break; case "Pager Meldung": operation.CustomData["Pager Meldung"] = msg; break; case "Einsatz ID": operation.OperationNumber = msg; break; case "Lat/Long": string[] values = msg.Split(';'); operation.Einsatzort.GeoLatitude = values[0].Trim().Replace(',', '.'); operation.Einsatzort.GeoLongitude = values[1].Trim().Replace(',', '.'); break; case "Beschreibung": operation.Comment = msg; break; } } return(operation); }
Operation IParser.Parse(string[] lines) { Operation operation = new Operation(); CurrentSection section = CurrentSection.AAnfang; lines = Utilities.Trim(lines); foreach (var line in lines) { string keyword; if (ParserUtility.StartsWithKeyword(line, _keywords, out keyword)) { switch (keyword.Trim()) { case "EINSATZNR": { section = CurrentSection.BeNr; break; } case "MITTEILER": { section = CurrentSection.CMitteiler; break; } case "EINSATZORT": { section = CurrentSection.DEinsatzort; break; } case "STRAßE": { section = CurrentSection.EStraße; break; } case "ABSCHNITT": { section = CurrentSection.FAbschnitt; break; } case "KREUZUNG": { section = CurrentSection.GKreuzung; break; } case "ORTSTEIL/ORT": { section = CurrentSection.HOrt; break; } case "OBJEKT": { section = CurrentSection.JObjekt; break; } case "EINSATZPLAN": { section = CurrentSection.KEinsatzplan; break; } case "MELDEBILD": { section = CurrentSection.LMeldebild; break; } case "HINWEIS": { section = CurrentSection.MHinweis; break; } case "GEFORDERTE EINSATZMITTEL": { section = CurrentSection.NEinsatzmittel; break; } case "(ALARMSCHREIBEN ENDE)": { section = CurrentSection.OEnde; break; } } } switch (section) { case CurrentSection.BeNr: int indexOf = line.IndexOf("ALARM", StringComparison.InvariantCultureIgnoreCase); if (indexOf == -1) { operation.OperationNumber = ParserUtility.GetMessageText(line, keyword); break; } operation.OperationNumber = ParserUtility.GetMessageText(line.Substring(0, indexOf), keyword); keyword = "ALARM"; try { operation.Timestamp = DateTime.Parse(ParserUtility.GetMessageText(line.Substring(indexOf), keyword)); } catch (FormatException) { operation.Timestamp = DateTime.Now; } break; case CurrentSection.CMitteiler: operation.Messenger = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.DEinsatzort: operation.Einsatzort.Location = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.EStraße: string msg = ParserUtility.GetMessageText(line, keyword); string street, streetNumber, appendix; ParserUtility.AnalyzeStreetLine(msg, out street, out streetNumber, out appendix); operation.CustomData["Einsatzort Zusatz"] = appendix; operation.Einsatzort.Street = street; operation.Einsatzort.StreetNumber = streetNumber; break; case CurrentSection.FAbschnitt: operation.CustomData["Einsatzort Abschnitt"] = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.GKreuzung: operation.Einsatzort.Intersection = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.HOrt: operation.Einsatzort.City = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.JObjekt: operation.Einsatzort.Property = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.KEinsatzplan: operation.OperationPlan = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.LMeldebild: operation.Picture = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.MHinweis: operation.Comment = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.NEinsatzmittel: if (line.StartsWith("Geforderte Einsatzmittel", StringComparison.InvariantCultureIgnoreCase)) { break; } OperationResource resource = new OperationResource(); if (line.Contains('(')) { string tool = line.Substring(line.IndexOf("(", StringComparison.Ordinal) + 1); tool = tool.Length >= 2 ? tool.Substring(0, tool.Length - 2).Trim() : String.Empty; string unit = line.Substring(0, line.IndexOf("(", StringComparison.Ordinal)); resource.FullName = unit; resource.RequestedEquipment.Add(tool); operation.Resources.Add(resource); } else { operation.Resources.Add(new OperationResource() { FullName = line }); } break; case CurrentSection.OEnde: break; } } return(operation); }
Operation IParser.Parse(string[] lines) { Operation operation = new Operation(); CurrentSection section = CurrentSection.AAnfang; lines = Utilities.Trim(lines); foreach (string line in lines) { string keyword; if (ParserUtility.StartsWithKeyword(line.TrimStart(), _keywords, out keyword)) { switch (keyword) { case "Einsatznr": { section = CurrentSection.BEinsatznr; break; } case "EArt": { section = CurrentSection.CEArt; break; } case "Stichwort": { section = CurrentSection.DStichwort; break; } case "Diagnose": { section = CurrentSection.EDiagnose; break; } case "Meldender": { section = CurrentSection.FMeldender; break; } case "Prioritaet": { section = CurrentSection.GPriorität; break; } case "Ort ": { section = CurrentSection.HOrt; break; } case "Ortsteil": { section = CurrentSection.IOrtsteil; break; } case "Strasse": { section = CurrentSection.JStraße; break; } case "Kreuzung": { section = CurrentSection.KKreuzung; break; } case "ADAC": { section = CurrentSection.MADAC; break; } case "Info": { section = CurrentSection.NInfo; break; } case "NRN": { section = CurrentSection.LNRN; break; } case "Objektname": { section = CurrentSection.OObjektname; break; } case "BMA-Nummer": { section = CurrentSection.SBMA; break; } case "Routenausgabe": { section = CurrentSection.PRoutenausgabe; break; } case "beteiligte Einsatzmittel:": { section = CurrentSection.QEinsatzmittel; break; } case "Ausdruck": { section = CurrentSection.REnde; break; } case "Besonderh": { section = CurrentSection.TBesonder; break; } } } switch (section) { case CurrentSection.AAnfang: { break; } case CurrentSection.BEinsatznr: { operation.OperationNumber = ParserUtility.GetMessageText(line); break; } case CurrentSection.CEArt: { operation.Keywords.Keyword = ParserUtility.GetMessageText(line); break; } case CurrentSection.DStichwort: { operation.Keywords.EmergencyKeyword = ParserUtility.GetMessageText(line); break; } case CurrentSection.EDiagnose: { operation.Picture = ParserUtility.GetMessageText(line); break; } case CurrentSection.FMeldender: { operation.Messenger = ParserUtility.GetMessageText(line); break; } case CurrentSection.GPriorität: { operation.Priority = ParserUtility.GetMessageText(line); section = CurrentSection.AAnfang; break; } case CurrentSection.HOrt: { operation.Einsatzort.City = ParserUtility.GetMessageText(line); break; } case CurrentSection.IOrtsteil: { operation.Einsatzort.City += " - " + ParserUtility.GetMessageText(line); break; } case CurrentSection.JStraße: { string street, streetNumber, appendix; ParserUtility.AnalyzeStreetLine(ParserUtility.GetMessageText(line), out street, out streetNumber, out appendix); operation.Einsatzort.Street = street; operation.Einsatzort.StreetNumber = streetNumber; operation.CustomData["Einsatzort Zusatz"] = appendix; break; } case CurrentSection.KKreuzung: { operation.Einsatzort.Intersection = ParserUtility.GetMessageText(line); break; } case CurrentSection.LNRN: { operation.CustomData.Add("NRN", ParserUtility.GetMessageText(line)); break; } case CurrentSection.MADAC: { operation.CustomData.Add("ADAC", ParserUtility.GetMessageText(line)); break; } case CurrentSection.NInfo: { operation.Comment = ParserUtility.GetMessageText(line); break; } case CurrentSection.OObjektname: { operation.Einsatzort.Property += ParserUtility.GetMessageText(line); operation.Einsatzort.Property = operation.Einsatzort.Property.Trim(); break; } case CurrentSection.SBMA: { operation.Einsatzort.Property += " BMA: " + ParserUtility.GetMessageText(line); operation.Einsatzort.Property = operation.Einsatzort.Property.Trim(); break; } case CurrentSection.PRoutenausgabe: { //TODO: Auswerten wenn Format bekannt ist. break; } case CurrentSection.QEinsatzmittel: { Match alarmtime = Regex.Match(line, @"(([01]?\d|2[0-3]):[0-5]\d:[0-5]\d)|(--:--:--)"); if (alarmtime.Success) { string time = alarmtime.Value; string unit = line.Replace(time, "").Trim(); operation.Resources.Add(new OperationResource { FullName = unit, Timestamp = time }); } break; } case CurrentSection.REnde: { Match datetime = Regex.Match(line, @"[123]\d\. \w* 20\d{2}, (([01]?\d|2[0-3]):[0-5]\d)"); if (datetime.Success) { CultureInfo ci = new CultureInfo("de"); DateTime timeStamp; operation.Timestamp = DateTime.TryParse(datetime.Value, ci, DateTimeStyles.None, out timeStamp) ? timeStamp : DateTime.Now; } break; } case CurrentSection.TBesonder: { operation.Einsatzort.Property += " Besonderheiten: " + ParserUtility.GetMessageText(line); operation.Einsatzort.Property = operation.Einsatzort.Property.Trim(); section = CurrentSection.AAnfang; break; } } } return(operation); }
Operation IParser.Parse(string[] lines) { Operation operation = new Operation(); CurrentSection section = CurrentSection.AAnfang; lines = Utilities.Trim(lines); foreach (var line in lines) { string keyword; if (ParserUtility.StartsWithKeyword(line, _keywords, out keyword)) { switch (keyword.Trim()) { case "E-Nr": { section = CurrentSection.BeNr; break; } case "EINSATZORT": { section = CurrentSection.CEinsatzort; break; } case "STRAßE": { section = CurrentSection.DStraße; break; } case "ORTSTEIL/ORT": { section = CurrentSection.EOrt; break; } case "OBJEKT": { section = CurrentSection.FObjekt; break; } case "EINSATZPLAN": { section = CurrentSection.GEinsatzplan; break; } case "MELDEBILD": { section = CurrentSection.HMeldebild; break; } case "EINSATZSTICHWORT": { section = CurrentSection.JEinsatzstichwort; break; } case "HINWEIS": { section = CurrentSection.KHinweis; break; } case "EINSATZMITTEL": { section = CurrentSection.LEinsatzmittel; break; } case "(ALARMSCHREIBEN ENDE)": { section = CurrentSection.MEnde; break; } } } switch (section) { case CurrentSection.BeNr: string opnummer = ParserUtility.GetTextBetween(line, "ALARM"); string optime = ParserUtility.GetTextBetween("ALARM"); operation.OperationNumber = ParserUtility.GetMessageText(opnummer, keyword); operation.Timestamp = ParserUtility.ReadFaxTimestamp(optime, DateTime.Now); break; case CurrentSection.CEinsatzort: operation.Zielort.Location = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.DStraße: string msg = ParserUtility.GetMessageText(line, keyword); string street, streetNumber, appendix; ParserUtility.AnalyzeStreetLine(msg, out street, out streetNumber, out appendix); operation.CustomData["Einsatzort Zusatz"] = appendix; operation.Einsatzort.Street = street; operation.Einsatzort.StreetNumber = streetNumber; break; case CurrentSection.EOrt: operation.Einsatzort.City = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.FObjekt: operation.Einsatzort.Property = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.GEinsatzplan: operation.OperationPlan = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.HMeldebild: operation.Picture = operation.Picture.AppendLine(ParserUtility.GetMessageText(line, keyword)); break; case CurrentSection.JEinsatzstichwort: operation.Keywords.EmergencyKeyword = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.KHinweis: operation.Comment = operation.Comment.AppendLine(ParserUtility.GetMessageText(line, keyword)); break; case CurrentSection.LEinsatzmittel: if (line.Equals("EINSATZMITTEL: ", StringComparison.InvariantCultureIgnoreCase)) { break; } OperationResource resource = new OperationResource(); if (line.Contains('(')) { string tool = line.Substring(line.IndexOf("(", StringComparison.Ordinal) + 1); tool = tool.Length >= 2 ? tool.Substring(0, tool.Length - 2).Trim() : String.Empty; string unit = line.Substring(0, line.IndexOf("(", StringComparison.Ordinal)); resource.FullName = unit; resource.RequestedEquipment.Add(tool); operation.Resources.Add(resource); } break; case CurrentSection.MEnde: break; } } return(operation); }
public Operation Parse(string[] lines) { Operation operation = new Operation(); operation.CustomData["Meldungen"] = string.Empty; operation.CustomData["Anfahrt"] = string.Empty; operation.CustomData["Hydranten"] = string.Empty; lines = Utilities.Trim(lines); CurrentSection section = CurrentSection.Header; string line; for (int i = 0; i < lines.Length; i++) { try { line = lines[i]; if (line.Length == 0) { continue; } string msg = line; string keyword; if (ParserUtility.StartsWithKeyword(line, Keywords, out keyword)) { msg = ParserUtility.GetMessageText(line, keyword); } if (!string.IsNullOrWhiteSpace(keyword)) { switch (keyword.ToUpperInvariant()) { case "GEMEINDE": section = CurrentSection.Einsatzinfos; Match match = Regex.Match(msg, @"\d{5}"); if (match.Success) { string zip = match.Value; operation.Einsatzort.City = msg.Replace(zip, "").Trim(); operation.Einsatzort.ZipCode = zip; } else { operation.Einsatzort.City = msg; } break; case "ORTSTEIL": operation.CustomData["Ortsteil"] = msg; break; case "STRASSE": operation.Einsatzort.Street = msg; break; case "NR.": operation.Einsatzort.StreetNumber = msg; break; case "OBJEKT": operation.Einsatzort.Property = msg; break; case "OBJEKTHINWEIS": operation.Comment = msg; break; case "EINATZPLAN-NR.": operation.OperationPlan = msg; break; case "HINWEIS": operation.Comment = operation.Comment.AppendLine(msg); break; case "MELDENDER": operation.Messenger = msg; break; case "ALTER": operation.CustomData["Alter"] = msg; break; case "EINSATZART": operation.Keywords.Keyword = msg; break; case "STICHWORT": operation.Keywords.EmergencyKeyword = msg; break; case "MELDUNGEN": section = CurrentSection.Meldungen; break; case "BEMERKUNG": section = CurrentSection.Bemerkung; operation.Comment = operation.Comment.AppendLine(msg); break; case "ANFAHRTSVORSCHLAG VON HAUPTWACHE": section = CurrentSection.Anfahrt; break; case "BETEILIGTE EINSATZMITTEL": section = CurrentSection.Einsatzmittel; break; case "HYDRANT VOR HAUSNUMMER": section = CurrentSection.Hydranten; break; } } else { switch (section) { case CurrentSection.Meldungen: operation.CustomData["Meldungen"] = (operation.CustomData["Meldungen"] as string).AppendLine(msg); break; case CurrentSection.Bemerkung: operation.Comment = operation.Comment.AppendLine(msg); break; case CurrentSection.Anfahrt: operation.CustomData["Anfahrt"] = (operation.CustomData["Anfahrt"] as string).AppendLine(msg); break; case CurrentSection.Einsatzmittel: Match result = Regex.Match(msg, @"\d{3}(\.\d{2}){2}"); if (result.Success) { operation.Resources.Add(new OperationResource { FullName = result.Value }); } break; case CurrentSection.Hydranten: operation.CustomData["Hydranten"] = (operation.CustomData["Hydranten"] as string).AppendLine(msg); break; } } } catch (Exception ex) { Logger.Instance.LogFormat(LogType.Warning, this, "Error while parsing line '{0}'. The error message was: {1}", i, ex.Message); } } //The last line contains sometimes informations about the alarmtime, operationnumber,... here I try(!) to get them. line = lines[lines.Length - 1]; try { Match result = Regex.Match(line, @"(0[1-9]|[12][0-9]|3[01])[- /.] ?(0[1-9]|1[012])[- /.] ?(19|20)\d\d"); DateTime date = DateTime.Now; if (result.Success) { DateTime.TryParse(result.Value.Replace(" ", ""), out date); } operation.Timestamp = ParserUtility.ReadFaxTimestamp(line, date); result = Regex.Match(line, @"\d{10}"); if (result.Success) { operation.OperationNumber = result.Value; } } catch (Exception ex) { Logger.Instance.LogFormat(LogType.Warning, this, "Error while parsing line '{0}'. The error message was: {1}", lines.Length - 1, ex.Message); } return(operation); }
Operation IParser.Parse(string[] lines) { Operation operation = new Operation(); CurrentSection section = CurrentSection.AAnfang; lines = Utilities.Trim(lines); foreach (var line in lines) { string keyword; if (ParserUtility.StartsWithKeyword(line, _keywords, out keyword)) { switch (keyword) { case "EINSATZNUMMER": { section = CurrentSection.BeNr; break; } case "ORT ": { section = CurrentSection.CEinsatzort; break; } case "STRASSE": { section = CurrentSection.DStraße; break; } case "OBJEKT ": { section = CurrentSection.FObjekt; break; } case "EINSATZPLANNUMMER": { section = CurrentSection.GEinsatzplan; break; } case "DIAGNOSE": { section = CurrentSection.HMeldebild; break; } case "EINSATZSTICHWORT": { section = CurrentSection.JEinsatzstichwort; break; } case "MELDENDE(R)": { section = CurrentSection.LMeldender; break; } case "BEMERKUNGEN": { section = CurrentSection.KHinweis; break; } case "DAS FAX WURDE": { section = CurrentSection.OFaxtime; break; } case "AUSDRUCK VOM": { section = CurrentSection.MEnde; break; } } } else { section = CurrentSection.MEnde; } switch (section) { case CurrentSection.BeNr: operation.OperationNumber = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.CEinsatzort: string txt = ParserUtility.GetMessageText(line, keyword); operation.Einsatzort.ZipCode = ParserUtility.ReadZipCodeFromCity(txt); operation.Einsatzort.City = txt.Remove(0, operation.Einsatzort.ZipCode.Length).Trim(); break; case CurrentSection.DStraße: operation.Einsatzort.Street = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.FObjekt: operation.Einsatzort.Property = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.GEinsatzplan: operation.OperationPlan = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.HMeldebild: operation.Picture = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.JEinsatzstichwort: operation.Keywords.EmergencyKeyword = ParserUtility.GetMessageText(line, keyword); break; case CurrentSection.KHinweis: operation.Comment = operation.Comment.AppendLine(ParserUtility.GetMessageText(line, keyword)); break; case CurrentSection.OFaxtime: operation.Timestamp = ParserUtility.ReadFaxTimestamp(line, DateTime.Now); break; case CurrentSection.MEnde: break; } } return(operation); }
Operation IParser.Parse(string[] lines) { Operation operation = new Operation(); CurrentSection section = CurrentSection.Anfang; lines = Utilities.Trim(lines); foreach (var line in lines) { string keyword; if (ParserUtility.StartsWithKeyword(line, _keywords, out keyword)) { string msg = ParserUtility.GetMessageText(line, keyword); switch (keyword.Trim()) { case "Einsatznummer": operation.OperationNumber = msg; break; case "Meldungseingang": operation.Timestamp = ParserUtility.ReadFaxTimestamp(msg, DateTime.Now); break; case "Stichwort": operation.Keywords.Keyword = msg; break; case "Sondersignal": operation.CustomData["Sondersignal"] = msg; break; case "Hinweis": operation.Comment = msg; break; case "Ort": string zip = ParserUtility.ReadZipCodeFromCity(msg); operation.Einsatzort.ZipCode = zip; operation.Einsatzort.City = msg.Replace(zip, "").Trim(); break; case "Ortsteil": operation.CustomData["Einsatzortz Ortsteil"] = msg; break; case "Strasse": string street, streetNumber, appendix; ParserUtility.AnalyzeStreetLine(msg, out street, out streetNumber, out appendix); operation.CustomData["Einsatzort Zusatz"] = appendix; operation.Einsatzort.Street = street; operation.Einsatzort.StreetNumber = streetNumber; break; case "Objekt": operation.Einsatzort.Property = msg; break; case "Kategorie": operation.CustomData["Einsatzobjekt Kategorie"] = msg; break; case "Information": operation.CustomData["Einsatzobjekt Information"] = msg; break; case "Einsatzplan": operation.OperationPlan = msg; break; case "BMA-Nr.": operation.CustomData["Einsatzobjekt BMA-Nr."] = msg; break; case "Objektplan": operation.CustomData["Einsatzobjekt Objektplan"] = msg; break; case "Zugeteilte Fahrzeuge": section = CurrentSection.Einsatzmittel; break; } } switch (section) { case CurrentSection.Einsatzmittel: if (line.Equals("Zugeteilte Fahrzeuge:", StringComparison.InvariantCultureIgnoreCase)) { break; } OperationResource resource = new OperationResource(); resource.FullName = line; operation.Resources.Add(resource); break; } } return(operation); }