예제 #1
0
        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);
        }
예제 #2
0
        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;
        }