static async Task ComposeNumericBlock(TextWriter writer, Func<int> lineNumberGetter, Action<int> lineNumberSetter, NumericResult result) { var lineNumber = lineNumberGetter(); //Lijn 1: aanduiding begin van een resultaat //formaat: #Ra lineNumber++; if (result is DynamicResult) { switch ((result as DynamicResult).TimeIndication) { case TimeIndication.Days: await writer.WriteLineAsync("#Rd"); break; case TimeIndication.Hours: await writer.WriteLineAsync("#Rh"); break; case TimeIndication.Minutes: await writer.WriteLineAsync("#Rm"); break; case TimeIndication.Seconds: await writer.WriteLineAsync("#Rs"); break; } } else await writer.WriteLineAsync("#Ra"); //Lijn 2: identificatie van de analyse //Formaat: //ofwel: de Medidoc code van de analyse (8 karakters) //ofwel: een code door het labo zelf gevormd (8 karakters) //ofwel: een ! gevolgd door de naam v.d. analyse (max. 56 karakters) lineNumber++; if (!string.IsNullOrEmpty(result.Code)) await writer.WriteLineAsync(result.Code?.TrimToMaxSize(8)); else await writer.WriteLineAsync(string.Concat("!", result.Name?.TrimToMaxSize(56))); //Lijn 3: de uitslag zelf //formaat: 1 karakter, met name: //= indien exacte uitslag //< indien uitslag kleiner dan //> indien uitslag groter dan //gevolgd door een getal van maximaal 8 cijfers (decimaal of breuk) //Indien er (nog) geen uitslag beschikbaar is, dan wordt op deze lijn één van de volgende aanduidingen geplaatst: //ofwel: =%% => betekent: uitslag volgt later //ofwel: =%%%% => betekent: er is geen uitslag en mag ook niet meer verwacht worden. //ofwel: =%% gevolgd door max. 75 karakters vrije tekst (beperking niet meer van toepassing voor de pakketten van Corilus nv) of de code van een standaard //commentaar (cfr. Appendix B) => betekent: er is geen uitslag, de tekst legt uit waarom. lineNumber++; await writer.WriteLineAsync(result.Value); //Lijn 4: de "Medidoc" eenheididentifikatie //formaat: 2 karakters lineNumber++; await writer.WriteLineAsync(result.Unit?.TrimToMaxSize(2)); //Lijn 5: aanduiding pathologisch/normaal (max. 6 karakters) lineNumber++; switch (result.Intensity) { case ResultIntensity.GreatlyReduced: await writer.WriteLineAsync("--"); break; case ResultIntensity.Reduced: await writer.WriteLineAsync("-"); break; case ResultIntensity.Normal: await writer.WriteLineAsync("="); break; case ResultIntensity.Increased: await writer.WriteLineAsync("+"); break; case ResultIntensity.GreatlyIncreased: await writer.WriteLineAsync("++"); break; default: break; } //Lijn 6,7,... : commentaar (facultatief) if (result.ReferenceValue != null) { lineNumber++; await writer.WriteLineAsync(string.Concat(@"\", result.ReferenceValue)); } if (result.Comment != null) using (var sr = new StringReader(result.Comment)) { string line; while ((line = sr.ReadLine()) != null) { lineNumber++; await writer.WriteLineAsync(line/*.TrimToMaxSize(75)*/); } } lineNumber++; await writer.WriteLineAsync("#R/"); lineNumberSetter(lineNumber); }
static async Task<NumericResult> ParseNumericBlock(TextReader reader, Func<int> lineNumberGetter, Action<int> lineNumberSetter, IDictionary<int, IList<string>> parserErrors, string firstLine) { NumericResult result; var lineNumber = lineNumberGetter(); switch (firstLine) { case "#Rd": result = new DynamicResult() { TimeIndication = TimeIndication.Days }; break; case "#Rh": result = new DynamicResult() { TimeIndication = TimeIndication.Hours }; break; case "#Rm": result = new DynamicResult() { TimeIndication = TimeIndication.Minutes }; break; case "#Rs": result = new DynamicResult() { TimeIndication = TimeIndication.Seconds }; break; default: result = new NumericResult(); break; } //Lijn 1: aanduiding begin van een resultaat //formaat: #Ra //Lijn 2: identificatie van de analyse //Formaat: //ofwel: de Medidoc code van de analyse (8 karakters) //ofwel: een code door het labo zelf gevormd (8 karakters) //ofwel: een ! gevolgd door de naam v.d. analyse (max. 56 karakters) lineNumber++; var id = (await reader.ReadLineAsync())?.Trim(); if (id?.StartsWith("!") ?? false) result.Name = id?.TrimStart('!').CheckMaxSize(56, parserErrors, lineNumber); else result.Code = id?.CheckMaxSize(8, parserErrors, lineNumber); //Lijn 3: de uitslag zelf //formaat: 1 karakter, met name: //= indien exacte uitslag //< indien uitslag kleiner dan //> indien uitslag groter dan //gevolgd door een getal van maximaal 8 cijfers (decimaal of breuk) //Indien er (nog) geen uitslag beschikbaar is, dan wordt op deze lijn één van de volgende aanduidingen geplaatst: //ofwel: =%% => betekent: uitslag volgt later //ofwel: =%%%% => betekent: er is geen uitslag en mag ook niet meer verwacht worden. //ofwel: =%% gevolgd door max. 75 karakters vrije tekst (beperking niet meer van toepassing voor de pakketten van Corilus nv) of de code van een standaard //commentaar (cfr. Appendix B) => betekent: er is geen uitslag, de tekst legt uit waarom. lineNumber++; result.Value = (await reader.ReadLineAsync())?.Trim(); if (result.Value == null || !Regex.Match(result.Value, @"([><=][0-9./]{0,8})|(%{2})|(%{4})|(%{2}.{0,75})", RegexOptions.IgnoreCase).Success) parserErrors.AddItem(lineNumber, $"Not a valid result value: '{result.Value}'"); //Lijn 4: de "Medidoc" eenheididentifikatie //formaat: 2 karakters lineNumber++; result.Unit = (await reader.ReadLineAsync())?.CheckMaxSize(2, parserErrors, lineNumber).Trim(); //Lijn 5: aanduiding pathologisch/normaal (max. 6 karakters) lineNumber++; var intensity = (await reader.ReadLineAsync())?.CheckMaxSize(6, parserErrors, lineNumber); switch (intensity?.Trim()) { case "--": case "LL": case "1": result.Intensity = ResultIntensity.GreatlyReduced; break; case "-": case "L": case "2": result.Intensity = ResultIntensity.Reduced; break; case "=": case "N": case "3": case "": result.Intensity = ResultIntensity.Normal; break; case "+": case "H": case "4": result.Intensity = ResultIntensity.Increased; break; case "++": case "HH": case "5": result.Intensity = ResultIntensity.GreatlyIncreased; break; default: result.Intensity = ResultIntensity.Normal; break; } //Lijn 6,7,... : commentaar (facultatief) var sb = new StringBuilder(); string line = null; lineNumber++; while ((line = (await reader.ReadLineAsync())) != null && !line.StartsWith(@"#R/")) { if (line.StartsWith(@"\")) result.ReferenceValue = line.TrimStart('\\'); else sb.AppendLine(line); lineNumber++; } result.Comment = sb.Length > 0 ? sb.ToString() : null; lineNumberSetter(lineNumber); return result; }