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(); 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 "ALARM": operation.Timestamp = ParserUtility.ReadFaxTimestamp(msg, DateTime.Now); break; case "EINSATZNUMMER": operation.OperationNumber = 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; case "RUFNUMMER": if (operation.Messenger != null) { 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 "ABSCHNITT": operation.Einsatzort.Intersection = msg; break; case "ORT": { innerSection = InnerSection.BOrt; 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.CObjekt; operation.Einsatzort.Property = msg; break; case "EINSATZPLANNUMMER": operation.OperationPlan = msg; break; case "STATION": innerSection = InnerSection.DStation; 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.BOrt: operation.Einsatzort.City += msg; break; case InnerSection.CObjekt: operation.Einsatzort.Property += msg; break; case InnerSection.DStation: operation.CustomData["Einsatzort Station"] += msg; break; } break; } } break; case CurrentSection.DZielort: { switch (prefix) { case "STRAßE": { innerSection = InnerSection.AStraß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": { innerSection = InnerSection.BOrt; operation.Zielort.ZipCode = ParserUtility.ReadZipCodeFromCity(msg); if (string.IsNullOrWhiteSpace(operation.Zielort.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.Zielort.City); } operation.Zielort.City = msg.Remove(0, operation.Zielort.ZipCode.Length).Trim(); } break; case "OBJEKT": innerSection = InnerSection.CObjekt; operation.Zielort.Property = msg; break; case "STATION": innerSection = InnerSection.DStation; operation.CustomData["Zielort Station"] = msg; break; default: switch (innerSection) { case InnerSection.AStraße: //Quite dirty because of Streetnumber. Looking for better solution operation.Zielort.Street += msg; break; case InnerSection.BOrt: operation.Zielort.City += msg; break; case InnerSection.CObjekt: operation.Zielort.Property += msg; break; case InnerSection.DStation: operation.CustomData["Zielort Station"] += msg; break; } break; } } break; case CurrentSection.EEinsatzgrund: { switch (prefix) { case "SCHLAGW.": operation.Keywords.Keyword = msg; break; case "STICHWORT": operation.Keywords.EmergencyKeyword = msg; break; } } break; case CurrentSection.FEinsatzmittel: { switch (prefix) { case "NAME": last.FullName = msg.Trim(); break; case "GEF. GERÄTE": // 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); } break; case "ALARMIERT": // Only add to requested equipment if there is some text, // otherwise the whole vehicle is the requested equipment if (!string.IsNullOrWhiteSpace(msg)) { last.Timestamp = msg; } operation.Resources.Add(last); last = new OperationResource(); break; } } 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(); 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(); OperationResource last = new OperationResource(); lines = Utilities.Trim(lines); bool keywordsOnly = true; CurrentSection section = CurrentSection.AHeader; 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 "TERMIN": operation.CustomData["Termin"] = msg; break; case "EINSATZNUMMER": // Try to parse the header and extract date and time if possible operation.Timestamp = ParserUtility.ReadFaxTimestamp(line, operation.Timestamp); if (msg.ToUpperInvariant().Contains("ALARMZEIT")) { msg = msg.Substring(0, msg.ToUpperInvariant().IndexOf("ALARMZEIT")).Trim(); } operation.OperationNumber = 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": { 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": 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"] = msg; break; } } break; case CurrentSection.EEinsatzgrund: { switch (prefix) { case "SCHLAGW.": operation.Keywords.Keyword = msg; break; case "STICHWORT B": operation.Keywords.B = ParserUtility.GetTextBetween(msg, null, "STICHWORT RD:"); operation.Keywords.R = ParserUtility.GetTextBetween(msg, "STICHWORT RD:"); break; case "STICHWORT SO": operation.Keywords.S = ParserUtility.GetTextBetween(msg, null, "STICHWORT TH:"); operation.Keywords.T = ParserUtility.GetTextBetween(msg, "STICHWORT TH:", "STICHWORT IN:"); operation.CustomData["Stichwort IN"] = ParserUtility.GetTextBetween(msg, "STICHWORT IN:"); break; case "PRIO.": operation.Priority = msg; break; } } break; case CurrentSection.FEinsatzmittel: { switch (prefix) { case "EINSATZMITTELNAME": last.FullName = msg.Trim(); break; case "GEF. GERÄTE": // 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); } // 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; } } break; case CurrentSection.GBemerkung: { // Append with newline at the end in case that the message spans more than one line operation.Comment = operation.Comment += msg + "\n"; } 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); } } // Post-processing the operation if needed if (!string.IsNullOrWhiteSpace(operation.Comment) && operation.Comment.EndsWith("\n")) { operation.Comment = operation.Comment.Substring(0, operation.Comment.Length - 1).Trim(); } return(operation); }
Operation IParser.Parse(string[] lines) { Operation operation = new Operation(); 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; } // Try to parse the header and extract date and time if possible operation.Timestamp = 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 (!StartsWithKeyword(line, 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.Substring(0, msg.IndexOf("ALARMZEIT", StringComparison.InvariantCultureIgnoreCase)); String dateString = msg.Substring(msg.IndexOf("ALARMZEIT", StringComparison.InvariantCultureIgnoreCase)).Trim().Remove(0, "ALARMZEIT".Length + 1).Trim(); DateTime time = DateTime.Now; DateTime.TryParse(dateString, out time); operation.Timestamp = time; break; case "TERMIN": operation.CustomData["Termin"] = msg; break; case "EINSATZNUMMER": operation.OperationNumber = 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": { 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).Trim(); } } break; case "ABSCHNITT": case "KREUZUNG": operation.Einsatzort.Intersection += msg; break; case "OBJEKT": operation.Einsatzort.Property = msg; break; case "STATION": operation.CustomData["Einsatzort Station"] = msg; break; case "KOORDINATE": Regex r = new Regex(@"[\d\.]+"); var matches = r.Matches(line); if (matches.Count == 2) { int geoRechts = Convert.ToInt32(matches[0].Value); int geoHoch = Convert.ToInt32(matches[1].Value); var geo = GeographicCoords.FromGaussKrueger(geoRechts, geoHoch); operation.Einsatzort.GeoLatitude = geo.Latitude; operation.Einsatzort.GeoLongitude = geo.Longitude; } break; case "ABTEILUNG": case "ZUSTÄNDIGE ILS": //These fields are currently unassigned. If required this can be done. 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; } } break; case CurrentSection.EEinsatzgrund: { switch (prefix) { case "SCHLAGWORT": operation.Keywords.Keyword = msg.Substring(0, msg.IndexOf("STICHWORT", StringComparison.InvariantCultureIgnoreCase)); operation.Keywords.EmergencyKeyword = msg.Substring(msg.IndexOf("STICHWORT", StringComparison.InvariantCultureIgnoreCase)).Trim().Remove(0, "STICHWORT".Length + 1).Trim(); break; case "PRIO.": operation.Priority = msg; break; } } break; case CurrentSection.FEinsatzmittel: { if (line.StartsWith("NAME", StringComparison.CurrentCultureIgnoreCase)) { //Thats the line "Name : Alarmiert : Aus : AN". Should be ignored. } else { operation.Resources.Add(new OperationResource { FullName = msg.Replace(':', ' ').Trim() }); } } break; case CurrentSection.Objektinfo: operation.CustomData["Objektinfo"] += line; break; case CurrentSection.GBemerkung: { 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(); OperationResource last = new OperationResource(); lines = Utilities.Trim(lines); CurrentSection section = CurrentSection.AHeader; bool keywordsOnly = true; NumberFormatInfo nfi = new NumberFormatInfo { NumberDecimalSeparator = "." }; 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 "EINSATZN.": operation.OperationNumber = 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": { operation.Einsatzort.Street = msg; } break; case "HAUS-NR.": { operation.Einsatzort.StreetNumber = msg; } break; case "ABSCHNITT": { operation.Einsatzort.Intersection = msg; } break; case "ORTSTEIL": { operation.CustomData["Einsatzort Ortsteil"] = 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 "KOORDINATE": Regex r = new Regex(@"\d+"); var matches = r.Matches(line); if (matches.Count > 2) { int rechts = Convert.ToInt32(matches[0].Value); int hoch = Convert.ToInt32(matches[1].Value); GaussKrueger gauss = new GaussKrueger(rechts, hoch); Geographic geo = (Geographic)gauss; operation.Einsatzort.GeoLatitude = geo.Latitude; operation.Einsatzort.GeoLongitude = geo.Longitude; } break; case "OBJEKT": operation.Einsatzort.Property = msg; break; case "EINSATZPLAN": operation.OperationPlan = msg; break; case "STATION": operation.CustomData["Einsatzort Station"] = msg; break; case "SCHLAGWORT": 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 I": operation.CustomData["Stichwort I"] = msg; break; case "STICHWORT R": operation.Keywords.R = msg; break; } } break; case CurrentSection.FEinsatzmittel: { switch (prefix) { case "NAME": last.FullName = msg.Trim(); break; case "AUSSTATTUNG": // 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); } // 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; } } 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(); OperationResource last = new OperationResource(); lines = Utilities.Trim(lines); CurrentSection section = CurrentSection.AHeader; bool keywordsOnly = true; double geoX = 0, geoY = 0; NumberFormatInfo nfi = new NumberFormatInfo { NumberDecimalSeparator = "." }; 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) string keyword = ""; if (keywordsOnly) { 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 "EINSATZNUMMER": operation.OperationNumber = msg; break; } } break; case CurrentSection.CKoordinaten: switch (prefix) { case "X": geoX = double.Parse(msg, nfi); break; case "Y": geoY = double.Parse(msg, nfi); var geo = GeographicCoords.FromGaussKrueger(geoX, geoY); operation.Einsatzort.GeoLatitude = geo.Latitude; operation.Einsatzort.GeoLongitude = geo.Longitude; break; } break; case CurrentSection.BMitteiler: switch (prefix) { case "NAME": operation.Messenger = msg; break; case "RUFNUMMER": operation.Messenger = operation.Messenger.AppendLine(string.Format("Nr.: {0}", msg)); break; } break; case CurrentSection.DEinsatzort: { switch (prefix) { case "STRAßE": operation.Einsatzort.Street = msg; break; case "HAUS-NR.": operation.Einsatzort.StreetNumber = msg; break; case "ORT": { operation.Einsatzort.ZipCode = ParserUtility.ReadZipCodeFromCity(msg); if (!string.IsNullOrWhiteSpace(operation.Einsatzort.ZipCode)) { operation.Einsatzort.City = msg.Replace(operation.Einsatzort.ZipCode, "").Trim(); } else { operation.Einsatzort.City = msg; } // 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 "STATION": operation.CustomData["Einsatzort Station"] = msg; break; } } break; case CurrentSection.EZielort: { switch (prefix) { case "STRAßE": operation.Zielort.Street = msg; break; case "HAUS-NR.": operation.Zielort.StreetNumber = msg; break; case "ORT": operation.Zielort.ZipCode = ParserUtility.ReadZipCodeFromCity(msg); if (!string.IsNullOrWhiteSpace(operation.Zielort.ZipCode)) { operation.Zielort.City = msg.Replace(operation.Zielort.ZipCode, "").Trim(); } else { operation.Zielort.City = msg; } break; case "OBJEKT": operation.Zielort.Property = msg; break; case "STATION": operation.CustomData["Zielort Station"] = msg; break; } } break; case CurrentSection.FEinsatzgrund: { switch (prefix) { case "SCHLAGW.": operation.Keywords.Keyword = msg; break; case "STICHWORT": operation.Keywords.EmergencyKeyword = msg; break; } } break; case CurrentSection.HEinsatzmittel: { switch (prefix) { case "NAME": last.FullName = msg; break; case "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); } break; case "ALARMIERT": last.Timestamp = ParserUtility.TryGetTimestampFromMessage(msg, DateTime.Now).ToString(); operation.Resources.Add(last); last = new OperationResource(); break; } } break; case CurrentSection.GBemerkungen: { operation.Picture = operation.Picture.AppendLine(msg); } break; case CurrentSection.ZFooter: // 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(); 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) string keyword = ""; if (keywordsOnly) { 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 "FAX": operation.CustomData["Fax"] = msg; break; case "TERMIN": operation.CustomData["Termin"] = msg; break; } } break; case CurrentSection.BMitteiler: operation.Messenger = msg; 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!", msg); } 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 = msg.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 "STATION": operation.CustomData["Einsatzort Station"] = msg; 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": { operation.Zielort.ZipCode = ParserUtility.ReadZipCodeFromCity(msg); if (string.IsNullOrWhiteSpace(operation.Zielort.ZipCode)) { Logger.Instance.LogFormat(LogType.Warning, this, "Could not find a zip code for city '{0}'. Route planning may fail or yield wrong results!", msg); } operation.Zielort.City = msg.Remove(0, operation.Zielort.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 = msg.IndexOf('-'); if (dashIndex != -1) { // Ignore everything after the dash operation.Zielort.City = operation.Einsatzort.City.Substring(0, dashIndex); } } break; case "OBJEKT": operation.Zielort.Property = msg; break; case "STATION": operation.CustomData["Zielort Station"] = msg; break; } } break; case CurrentSection.EEinsatzgrund: { switch (prefix) { case "SCHLAGW.": operation.Keywords.Keyword = msg; break; case "PRIO.": operation.Priority = msg; break; } } break; case CurrentSection.FBemerkung: { // Append with newline at the end in case that the message spans more than one line operation.Comment += msg + Environment.NewLine; } break; case CurrentSection.GEinsatzmittel: { last.FullName = msg; operation.Resources.Add(last); last = new OperationResource(); } 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(); 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); }
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)) { if (section == CurrentSection.CEinsatzort) { Regex r = new Regex(@"\d+"); var matches = r.Matches(line); if (matches.Count == 2) { int geoRechts = Convert.ToInt32(matches[0].Value); int geoHoch = Convert.ToInt32(matches[1].Value); var geo = GeographicCoords.FromGaussKrueger(geoRechts, geoHoch); operation.Einsatzort.GeoLatitude = geo.Latitude; operation.Einsatzort.GeoLongitude = geo.Longitude; } } continue; } string msg = line; string prefix = ""; // Make the keyword check - or not (depends on the section we are in; see above) string keyword = ""; if (keywordsOnly) { 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 "EINSATZ-NR.": operation.OperationNumber = msg; break; } } break; case CurrentSection.BMitteiler: operation.Messenger = msg; 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 "GEMEINDE": { 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; } } break; case CurrentSection.DEinsatzgrund: { switch (prefix) { case "SCHLAGW.": operation.Keywords.Keyword = msg; break; case "STICHWORT": operation.Keywords.EmergencyKeyword = msg; break; case "PRIORITÄT": operation.Priority = msg; break; } } break; case CurrentSection.EEinsatzmittel: { switch (prefix) { case "NAME": last.FullName = msg; break; case "ALARMIERT": msg = ParserUtility.GetTextBetween(msg, null, "AUS"); last.Timestamp = ParserUtility.TryGetTimestampFromMessage(msg, DateTime.Now).ToString(); break; case "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); } 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.Picture += msg + Environment.NewLine; } break; case CurrentSection.GHinweis: { // 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(); 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; } // 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 "EINSATZ": operation.OperationNumber = 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": { 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) { operation.CustomData["Einsatzort Kommune"] = operation.Einsatzort.City.Substring(dashIndex).Trim(); // Ignore everything after the dash operation.Einsatzort.City = operation.Einsatzort.City.Substring(0, dashIndex).Trim(); } } break; case "ABSCHNITT": operation.Zielort.Intersection = msg; break; case "OBJEKT": operation.Einsatzort.Property = msg; break; case "PLANNUMMER": operation.OperationPlan = msg; break; case "STATION": operation.CustomData["Einsatzort Station"] = msg; break; case "ZONE": operation.Einsatzort.Location = msg; 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 zipcode = ParserUtility.ReadZipCodeFromCity(msg); operation.Zielort.ZipCode = zipcode; operation.Zielort.City = msg.Remove(0, zipcode.Length).Trim(); } break; case "OBJEKT": operation.Zielort.Property = msg; break; case "STATION": operation.CustomData["Zielort Station"] = msg; break; } } break; case CurrentSection.EEinsatzgrund: { switch (prefix) { case "SCHLAGW.": Regex regex = new Regex("\\[(.*)]"); if (regex.IsMatch(msg)) { Match match = regex.Match(msg); operation.Keywords.EmergencyKeyword = match.Groups[1].Value; operation.Keywords.Keyword = msg.Replace(match.Value, ""); } else { 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 I": operation.CustomData["Stichwort I"] = msg; break; case "STICHWORT R": operation.Keywords.R = msg; break; case "PRIO.": operation.Priority = msg; break; } } break; case CurrentSection.FEinsatzmittel: { if (line.StartsWith("NAME", StringComparison.CurrentCultureIgnoreCase)) { continue; } int indexEquip = line.IndexOf(":", StringComparison.Ordinal); int indexTime = line.IndexOf(":", indexEquip + 1, StringComparison.Ordinal); if (line.Contains("Fehlt:")) { indexTime = line.IndexOf(":", indexTime + 1, StringComparison.Ordinal); } OperationResource resource = new OperationResource(); resource.FullName = line.Substring(0, indexEquip).Trim(); resource.RequestedEquipment.Add(line.Substring(indexEquip + 1, indexTime - indexEquip - 1).Trim()); resource.Timestamp = line.Substring(indexTime + 1).Trim(); operation.Resources.Add(resource); } 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.HTextbausteine: { // Append with newline at the end in case that the message spans more than one line operation.Picture = operation.Picture.AppendLine(msg); } break; case CurrentSection.IFooter: // 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); 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: //TODO: Absender unterbringen 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 "ORT": { innerSection = InnerSection.BOrt; 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.CObjekt; operation.Einsatzort.Property = msg; break; case "KREUZUNG": operation.Einsatzort.Intersection = msg; break; case "KOORDINATE": Regex r = new Regex(@"(\d+\.\d+)"); var matches = r.Matches(line); if (matches.Count == 2) { NumberFormatInfo nfi = new NumberFormatInfo { NumberDecimalSeparator = "." }; double geoRechts = Convert.ToDouble(matches[0].Value, nfi); double geoHoch = Convert.ToDouble(matches[1].Value, nfi); var geo = GeographicCoords.FromGaussKrueger(geoRechts, geoHoch); operation.Einsatzort.GeoLatitude = geo.Latitude; operation.Einsatzort.GeoLongitude = geo.Longitude; } break; default: switch (innerSection) { case InnerSection.AStraße: //Quite dirty because of Streetnumber. Looking for better solution operation.Einsatzort.Street += msg; break; case InnerSection.BOrt: operation.Einsatzort.City += msg; break; case InnerSection.CObjekt: operation.Einsatzort.Property += msg; break; } break; } } break; case CurrentSection.DZielort: switch (prefix) { case "STRAßE": { innerSection = InnerSection.AStraß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": { innerSection = InnerSection.BOrt; operation.Zielort.ZipCode = ParserUtility.ReadZipCodeFromCity(msg); if (string.IsNullOrWhiteSpace(operation.Zielort.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.Zielort.City); } operation.Zielort.City = msg.Remove(0, operation.Zielort.ZipCode.Length).Trim(); } break; case "OBJEKT": innerSection = InnerSection.CObjekt; operation.Zielort.Property = 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.BOrt: operation.Einsatzort.City += msg; break; case InnerSection.CObjekt: operation.Einsatzort.Property += msg; break; } break; } break; case CurrentSection.EEinsatzgrund: { switch (prefix) { case "SCHLAGW.": operation.Keywords.Keyword = msg; break; case "STICHWORT": operation.Keywords.EmergencyKeyword = msg; break; } } break; case CurrentSection.FEinsatzmittel: { operation.Resources.Add(new OperationResource { FullName = msg.Substring(0, msg.LastIndexOf('(')) }); } 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(); 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) string keyword = ""; if (keywordsOnly) { 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.OperationNumber = ParserUtility.GetTextBetween(msg, "Einsatznummer:"); break; } } break; case CurrentSection.BEinsatzort: { 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": { string zipCode = ParserUtility.ReadZipCodeFromCity(msg); operation.Einsatzort.ZipCode = zipCode; operation.Einsatzort.City = ParserUtility.GetTextBetween(msg, null, "Gemeinde"); operation.Einsatzort.City = operation.Einsatzort.City.Replace(zipCode, "").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); } operation.CustomData["Einsatzort Gemeinde"] = ParserUtility.GetTextBetween(msg, "Gemeinde:"); } break; case "OBJEKT": operation.Einsatzort.Property = msg; break; case "STATION": operation.CustomData["Einsatzort Station"] = msg; break; case "KREUZUNG": operation.Einsatzort.Intersection = msg; break; case "PLANNUMMER": operation.OperationPlan = msg; break; } } break; case CurrentSection.CEreignis: { switch (prefix) { case "MELDEBILD": operation.Keywords.Keyword = msg; break; case "PRIORITÄT": operation.Priority = msg; 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": { operation.Zielort.City = ParserUtility.GetTextBetween(msg, null, "Gemeinde"); // 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.Zielort.City.IndexOf('-'); if (dashIndex != -1) { // Ignore everything after the dash operation.Zielort.City = operation.Einsatzort.City.Substring(0, dashIndex); } operation.CustomData["Zielort Gemeinde"] = ParserUtility.GetTextBetween(msg, "Gemeinde:"); } break; case "OBJEKT": operation.Zielort.Property = msg; break; case "STATION": operation.CustomData["Zielort Station"] = msg; break; } break; case CurrentSection.FEinsatzmittel: { string name, equip; name = ParserUtility.GetTextBetween(msg, null, ">> gefordert:"); equip = ParserUtility.GetTextBetween(msg, ">> gefordert:"); OperationResource resource = new OperationResource { FullName = name, RequestedEquipment = new List <string>() { equip } }; operation.Resources.Add(resource); } break; case CurrentSection.EBemerkung: { // Append with newline at the end in case that the message spans more than one line operation.Picture = operation.Picture.AppendLine(msg); } break; case CurrentSection.GFooter: // The footer can be ignored completely. break; } } catch (Exception ex) { string l = lines[i]; 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 (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); }