Add Lauris paragraph parser.

This commit is contained in:
Daniel Kraus 2015-06-29 21:50:27 +02:00
parent 39f63835be
commit 443f3ac4e1
11 changed files with 404 additions and 159 deletions

View File

@ -126,5 +126,14 @@ namespace Tests
Assert.IsFalse(i.HasUpperLimit, "HasUpperLimit");
// TODO: Define the behavior of LabItem.IsNormal if no normal value known
}
[TestCase("Albumin (SU)/die: 149.9 [<= 30] mg/d; ", Material.SU)]
[TestCase("Gesamt-Eiweiss/Creatinin (PU): 281 [<= 70] mg/g Crea;", Material.U)]
[TestCase("Cystatin C (N Latex): 2.37 [0.57 - 0.96] mg/l; ", Material.B)]
public void ParseLaurisMaterial(string laurisString, Material expectedMaterial)
{
LabItem i = new LabItem(laurisString);
Assert.AreEqual(expectedMaterial, i.Material);
}
}
}

36
Tests/LaurisParagraphTest.cs Executable file
View File

@ -0,0 +1,36 @@
/* LaurisParagraphTest.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using NUnit.Framework;
using zaaReloaded2.Models;
namespace Tests
{
[TestFixture]
class LaurisParagraphTest
{
[Test]
public void ParseParagraph()
{
string demo = "Klinische Chemie: Natrium: 139 [135 - 145] mmol/l;  " +
"Kalium: 5.2 [3.5 - 5] mmol/l;  Calcium: 2.4 [2.0 - 2.7] mmol/l;";
LaurisParagraph lp = new LaurisParagraph(demo);
Assert.AreEqual(139, lp.Items["Natrium"].NumericalValue);
Assert.AreEqual(2.4, lp.Items["Calcium"].NumericalValue);
}
}
}

View File

@ -59,6 +59,7 @@
<ItemGroup>
<Compile Include="Dictionaries\DictionaryTest.cs" />
<Compile Include="LabItemTest.cs" />
<Compile Include="LaurisParagraphTest.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="LineParserTest.cs" />
<Compile Include="Dictionaries\TestDictionary.cs" />
@ -76,6 +77,9 @@
<ItemGroup>
<EmbeddedResource Include="Dictionaries\test_dictionary.txt" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="demo-output.txt" />
</ItemGroup>
<Choose>
<When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
<ItemGroup>

17
Tests/demo-output.txt Executable file
View File

@ -0,0 +1,17 @@
[22.10.2013 12:30:00]
Aerobe Kultur: Enterokokken ;  Wachstum: 10 ;
Auftragskommentare: Untersuchungsmaterial:: Mittelstrahlurin (nativ) ;  Befundstatus Auftrag: Endbefund ;
Urinproteine quantitativ: Gesamt-Eiweiss (PU): 135 [<= 120] mg/l;  Gesamt-Eiweiss/Creatinin (PU): 281 [<= 70] mg/g Crea;  Albumin (PU): 57 [<= 30] mg/l;  Albumin/Creatinin (PU): 118.8 [<= 30] mg/g Crea;
Urin - Klin. Chemie: Creatinin (PU): 48.0 [40 - 278] mg/dl;
Urinproteine quantitativ: Gesamt-Eiweiss (SU): 184 [<= 120] mg/l;  Gesamt-Eiweiss (SU)/die: 340 [<= 150] mg/d;  Albumin (SU): 81 mg/l;  Albumin (SU)/die: 149.9 [<= 30] mg/d;  a1-Microglobulin (SU): 35.3 mg/l;  a1-Microglobulin (SU)/die: 65.3 [<= 20] mg/d;  Immunglobulin G (SU): 8 mg/l;  Immunglobulin G (SU)/die: 14.8 [<= 15] mg/d;
Urin - Klin. Chemie: Sammelzeit (U): 24 h;  Sammelmenge (U): 1850 ml;
Klinische Chemie: Natrium: 139 [135 - 145] mmol/l;  Kalium: 5.2 [3.5 - 5] mmol/l;  Calcium: 2.4 [2.0 - 2.7] mmol/l;  anorg. Phosphat: 0.58 [0.87 - 1.45] mmol/l;  Calcium-Phosphat-Produkt: 1.39 [<= 4.4] mmol²/l²;  Glucose: 112 [74 - 106] mg/dl;  glomerul. Filtrationsr. CKD-EP: 42 ml/min /1,73qm;  glomerul. Filtrationsr. (MDRD): 42 ml/min /1,73qm;  Creatinin: 1.84 [0 - 1.17] mg/dl;  Harnstoff: 54.3 [10 - 50] mg/dl;  Harnsäure: 4.6 [3.4 - 7] mg/dl;  Gesamt-Bilirubin: 0.7 [0.1 - 1.2] mg/dl;  GOT (ASAT): 303.0 [<= 50] U/l;  GPT (ALAT): 508.0 [<= 50] U/l;  GGT: 489.0 [<= 60] U/l;  Alk. Phosphatase: 56 [40 - 130] U/l;  Lactat Dehydrogenase: 320 [<= 250] U/l;  CK gesamt: 52 [<= 190] U/l;  Amylase: 62 [<= 110] U/l;  Cholesterin: 120 [130 - 220] mg/dl;  Triglyceride: 94 [74 - 172] mg/dl;  LDL - Cholesterin: 56 [0 - 150] mg/dl;  HDL - Cholesterin: 45 [>= 35] mg/dl;  Eisen: 215 [59 - 158] µg/dl;  Gesamt-Eiweiss: 5.7 [6.6 - 8.7] g/dl;  Albumin: 4.0 [3.5 - 5.5] g/dl;
Gerinnung: Niedermol. Heparin (Anti-Xa): 0.99 U/ml;
Hämatologie: Leukozyten: 2.9 [5 - 10] n*1000/µl;  Erythrozyten: 3.23 [4 - 6] n*10E6/µl;  Hämoglobin: 10.1 [14 - 18] g/dl;  Hämatokrit: 30.8 [42 - 50] %;  MCV: 95.4 [82 - 94] fl;  MCH (HbE): 31.3 [27 - 33] pg;  MCHC: 32.8 [32 - 36] g/dl;  Thrombozyten: 112 [150 - 450] n*1000/µl;  Mittleres Plättchenvolumen: 11.1 [9.7 - 11.9] fl;  Neutrophile: 74.4 [41 - 70] %;  Lymphozyten: 13.0 [25 - 40] %;  Monozyten: 11.3 [2 - 8] %;  Eosinophile: 1.0 [0.8 - 6.2] %;  Basophile: 0.3 [0 - 1] %;  Neutrophile: 2.18 [1.8 - 7.2] n*1000/µl;  Lymphozyten: 0.38 [1 - 4.05] n*1000/µl;  Monozyten: 0.33 [0.08 - 0.8] n*1000/µl;  Eosinophile: 0.0 [0.04 - 0.36] n*1000/µl;  Basophile: 0.0 [0 - 0.08] n*1000/µl;  Unreife Granulozyten: 0.3 %;
Urinproteine quantitativ: Gesamt-Eiweiss (SU): 186 [<= 120] mg/l;  Gesamt-Eiweiss (SU)/die: 344 [<= 150] mg/d;  Albumin (SU): 79 mg/l;  Albumin (SU)/die: 146.2 [<= 30] mg/d;
Urin - Klin. Chemie: Sammelzeit (U): 24 h;  Sammelmenge (U): 1850 ml;  Creatinin-Clearance (SU)/min: 46 [98 - 156] ml/min;  Harnstoff-Clearance (SU)/min: 21 [60 - 80] ml/min;  glomeruläre Filtrationsrate: 34 ml/min;  Calcium (SU): 0.79 mmol/l;  Calcium (SU)/die: 1.46 [2.5 - 8] mmol/d;  Creatinin (SU): 65.5 mg/dl;  Harnstoff (SU): 904 [900 - 3000] mg/dl;  Harnstoff (SU)/die: 16.7 [<= 35] g/d;  Kalium (SU): 24.4 [20 - 80] mmol/l;  Kalium (SU)/die: 45.14 [25 - 125] mmol/d;  Natrium (SU): 133.2 [54 - 150] mmol/l;  Natrium (SU)/die: 246.4 [40 - 220] mmol/d;
Serumproteine und Tumormarker: Ferritin: 3754 [30 - 400] µg/l;  Transferrin: 217 [200 - 380] mg/dl;  Transferrinsättigung: 70.2 [16 - 45] %;  Haptoglobin: < 10 [34 - 200] mg/dl;  C-reaktives Protein: < 0.01 [0 - 0.5] mg/dl;  Cystatin C (N Latex): 2.37 [0.57 - 0.96] mg/l;
Akutbestimmungen / TDM / Drogen: Tacrolimus (FK506): 10.7 µg/l;
Klinische Chemie: Natrium: 140 [135 - 145] mmol/l;  Kalium: 5.2 [3.5 - 5] mmol/l;  Calcium: 2.3 [2.0 - 2.7] mmol/l;  anorg. Phosphat: 0.59 [0.87 - 1.45] mmol/l;  Chlorid: 109 [94 - 110] mmol/l;  Glucose: 114 [74 - 106] mg/dl;  glomerul. Filtrationsr. CKD-EP: 42 ml/min /1,73qm;  glomerul. Filtrationsr. (MDRD): 42 ml/min /1,73qm;  Creatinin: 1.85 [0 - 1.17] mg/dl;  Harnstoff: 56.1 [10 - 50] mg/dl;  Cholinesterase: 3387 [5320 - 12920] U/l;  Lactat Dehydrogenase: 318 [<= 250] U/l;  Gesamt-Eiweiss: 5.7 [6.6 - 8.7] g/dl;  Albumin: 3.9 [3.5 - 5.5] g/dl;
Serumproteine und Tumormarker: C-reaktives Protein: < 0.01 [0 - 0.5] mg/dl;
Akutbestimmungen / TDM / Drogen: PO2 (art.): 64.0 [70 - 100] mmHg;  PCO2 (art.): 36.3 [36 - 44] mmHg;  pH: 7.393 [7.36 - 7.44] ;  Basenabweichung: -2.4 [-2 - 2] mmol/l;  aktuelles Bicarbonat: 21.6 [22 - 26] mmol/l;  Standard Bicarbonat: 22.4 [22 - 26] mmol/l;  Sauerstoffsättigung (art.): 95.8 [95 - 99] %;

View File

@ -1,117 +1,114 @@
# LAURIS-NAME "KANONISCHER NAME" MATERIAL "IMMER REFERENZBEREICH"
# =========== ================== ======== =======================
"Lactat Dehydrogenase" LDH S
"Cystatin C" --- S X
"glomerul. Filtrationsr. CKD-EP" "eGFR (CKD-EPI)" S
Übergangsepithelien (U) --- U
a1-Microglobulin (SU) --- SU
a1-Microglobulin (SU)/die --- SU
aktuelles Bicarbonat --- BGA
Albumin (PU) --- U
Albumin (SU) --- SU
Albumin (SU)/die --- SU
Albumin --- S
Albumin/Creatinin (PU) --- U
Alk. Phosphatase --- S
Amylase --- S
anorg. Phosphat --- S
Bakterien (U) --- U
Basenabweichung --- BGA
Basophile --- E
Bilirubin (U) --- U
C-reaktives Protein --- S
Calcium (SU) --- SU
Calcium (SU)/die --- SU
Calcium --- S
Calcium-Phosphat-Produkt --- S
Cholesterin --- S
CK gesamt --- S
CK MB --- S
Creatinin (PU) --- U
Creatinin (SU) --- SU
Creatinin --- S
Creatinin-Clearance (SU)/min --- SU
Cyclosporin-A vor Gabe --- S
Cystatin C (N Latex) --- S
Eisen --- S
Eosinophile --- E
Erythrozyten (U) --- U
Erythrozyten --- E
Ferritin --- S
Gesamt-Bilirubin --- S
Gesamt-Eiweiss (PU) --- U
Gesamt-Eiweiss (SU) --- SU
Gesamt-Eiweiss (SU)/die --- SU
Gesamt-Eiweiss --- S
Gesamt-Eiweiss/Creatinin (PU) --- U
GGT --- S
glomeruläre Filtrationsrate --- SU
glomerul. Filtrationsr. (MDRD) --- S
glomerul. Filtrationsr. CKD-EP --- S
Glucose (U) --- U
Glucose --- S
GOT (ASAT) --- S
GPT (ALAT) --- S
Hämatokrit --- E
Hämoglobin --- E
Haptoglobin --- S
Harnsäure --- S
Harnstoff (SU) --- SU
Harnstoff (SU)/die --- SU
Harnstoff --- S
Harnstoff-Clearance (SU)/min --- SU
HbA1c (NGSP) --- E
HDL - Cholesterin --- S
hyaline Zylinder (U) --- U
Kalium (SU) --- U
Kalium (SU)/die --- SU
Kalium --- S
Ketonkörper (U) --- U
Lactat Dehydrogenase --- S
LDL - Cholesterin --- S
Leukozyten (U) --- U
Leukozyten --- E
Lymphozyten --- E
MCH (HbE) --- E
MCHC --- E
MCV --- E
Mittleres Plättchenvolumen --- E
Monozyten --- E
Natrium (SU) --- SU
Natrium (SU)/die --- SU
Natrium --- S
Neutrophile --- E
Nitrit (U) --- U
NT-proBNP --- S
PCO2 (art.) --- BGA
pH (U) --- U
pH --- BGA
Plattenepithelien (U) --- U
PO2 (art.) --- BGA
Protein (U) --- U
Sammelmenge (U) --- SU
Sammelzeit (U) --- SU
Sauerstoffsättigung (art.) --- BGA
Sirolimus --- S
spezifisches Gewicht (U) --- U
Standard Bicarbonat --- BGA
Tacrolimus (FK506) --- S
Thrombozyten --- E
Transferrin --- S
Transferrinsättigung --- S
Triglyceride --- S
Troponin T (high sensitive) --- S
Unreife Granulozyten --- E
Urobilinogen (U) --- U
Niedermol. Heparin (Anti-Xa) --- Z
Thromboplastinzeit n. Quick --- Z
PTT --- Z
Ratio int. norm. --- Z
Komplementfaktor C3c --- S
Komplementfaktor C4 --- S
Anti-DNAse B --- S
Anti-Streptolysin --- S
PTH intakt --- S
TSH --- S
HAPTOGLOBIN --- S
FRAGMENTOZYTEN --- E
"Übergangsepithelien (U)" Übergangsep. U
"a1-Microglobulin (SU)" a1-Microglobulin SU
"a1-Microglobulin (SU)/die" a1-Microglobulin SU
"aktuelles Bicarbonat" Bic BGA
"Albumin (PU)" Alb U
"Albumin (SU)" Alb SU
"Albumin (SU)/die" Alb SU
Albumin Alb S
Albumin/Creatinin (PU)" ACR U
"Alk. Phosphatase" AP S
Amylase Amylase S
anorg. Phosphat" Phosphat S
Bakterien (U)" Bakt U
Basenabweichung BE BGA
Basophile Baso E
Bilirubin (U)" Bilirubin U
C-reaktives Protein" CRP S
Calcium (SU)" Ca SU
Calcium (SU)/die" Ca SU
Calcium Ca S
Calcium-Phosphat-Produkt CaxP S
Cholesterin Chol S
CK gesamt" CK S
CK MB" CK-MB S
Creatinin (PU)" Krea U
Creatinin (SU)" Krea SU
Creatinin Krea S
Creatinin-Clearance (SU)/min" CrCl SU
Cyclosporin-A vor Gabe" "CsA (C0)" S X
Cystatin C (N Latex)" "Cystatin C" S X
Eisen Fe S
Eosinophile Eos E
Erythrozyten (U)" Ery U
Erythrozyten Ery E
Ferritin Ferr S
Gesamt-Bilirubin Bilirubin S
Gesamt-Eiweiss (PU)" Protein U
Gesamt-Eiweiss (SU)" Protein SU
Gesamt-Eiweiss (SU)/die" Proteinurie SU
Gesamt-Eiweiss Protein S
Gesamt-Eiweiss/Creatinin (PU)" TPCR U
GGT GGT S
glomeruläre Filtrationsrate" GFR SU
glomerul. Filtrationsr. (MDRD)" "eGFR (MDRD)" S
glomerul. Filtrationsr. CKD-EP" "eGFR (CKD-EPI)" S
Glucose (U)" Glukose U
Glucose Glukose S
GOT (ASAT)" GOT S
GPT (ALAT)" GPT S
Hämatokrit Hkt E
Hämoglobin Hb E
Haptoglobin Haptoglobin S X
Harnsäure Harnsäure S
Harnstoff (SU)" Hst SU
Harnstoff (SU)/die" Hst/Tag SU
Harnstoff" Hst S
Harnstoff-Clearance (SU)/min" HstCl SU
HbA1c (NGSP)" HbA1c E
HDL - Cholesterin" HDL S
hyaline Zylinder (U)" "hyal. Zyl." U
Kalium (SU)" K U
Kalium (SU)/die" K SU
Kalium K S
Ketonkörper (U)" KK U
Lactat Dehydrogenase" LDH S
LDL - Cholesterin" LDL S
Leukozyten (U)" Leu U
Leukozyten Leu E
Lymphozyten Lym E
MCH (HbE) MCH E
MCHC MCHC E
MCV MCV E
Mittleres Plättchenvolumen MPV E
Monozyten Mon E
Natrium (SU)" Na SU
Natrium (SU)/die" Na SU
Natrium Na S
Neutrophile Neu E
Nitrit (U)" Nitrit U
NT-proBNP NT-proBNP S
PCO2 (art.)" pCO2 BGA
pH (U)" pH U
pH" pH BGA
Plattenepithelien (U)" Plattenep U
PO2 (art.)" pO2 BGA
Protein (U)" Protein U
Sammelmenge (U)" Volumen SU
Sammelzeit (U)" Zeit SU
Sauerstoffsättigung (art.)" SO2 BGA
Sirolimus SIR S
spezifisches Gewicht (U)" "spez. Gew." U
Standard Bicarbonat" "Std.-Bic." BGA
Tacrolimus (FK506)" TAC S
Thrombozyten Thr E
Transferrin Transferrin S
Transferrinsättigung" Tf.-Sätt. S
Triglyceride" TG S
Troponin T (high sensitive)" hsTnT S
Unreife Granulozyten" Gran E
Urobilinogen (U)" Urobilinogen U
Niedermol. Heparin (Anti-Xa)" Anti-Xa Z
Thromboplastinzeit n. Quick" Quick Z
PTT aPTT Z
Ratio int. norm." INR Z
Komplementfaktor C3c C3c S X
Komplementfaktor C4 C4 S X
Anti-DNAse B "Anti-DNAse B" S
Anti-Streptolysin ASL S
PTH intakt" iPTH S
TSH TSH S
HAPTOGLOBIN Haptoglobin S
FRAGMENTOZYTEN Fragmentozyten E

View File

@ -30,7 +30,7 @@ namespace zaaReloaded2.Dictionaries
/// canonical parameter names, and to assign categories and determine
/// which parameters always require the output of reference intervals.
/// </summary>
class ParameterDictionary : DictionaryBase
public class ParameterDictionary : DictionaryBase
{
#region Public methods
@ -49,19 +49,18 @@ namespace zaaReloaded2.Dictionaries
/// Looks up the material for a given <paramref name="laurisName"/>.
/// </summary>
/// <param name="laurisName">Lauris item name to look up.</param>
/// <returns><see cref="zaaReloaded2.Models.Materials"/> enum; if no material is
/// <returns><see cref="zaaReloaded2.Models.Material"/> enum; if no material is
/// found in the dictionary, the default material "S" (serum) is returned.</returns>
public Materials GetMaterial(string laurisName)
public Material GetMaterial(string laurisName)
{
string textValue = LookUpValue(laurisName, 2);
try
{
Materials m = (Materials)Enum.Parse(typeof(Materials), textValue, true);
return m;
return MaterialFactory.FromAbbreviation(textValue);
}
catch
{
return Materials.S;
return Material.B;
}
}

View File

@ -28,7 +28,7 @@ namespace zaaReloaded2.Dictionaries
/// Dictionary that is used to convert Lauris units to canonical
/// zaaReloaded2 units.
/// </summary>
class UnitDictionary : DictionaryBase
public class UnitDictionary : DictionaryBase
{
#region Public methods

View File

@ -172,9 +172,29 @@ namespace zaaReloaded2.Models
/// </summary>
public string CanonicalName { get; private set; }
/// <summary>
/// Returns the canonical name prefixed with the abbreviation
/// for the material, e.g. "U-Na" for sodium in the spot urine,
/// but only if the material is not blood.
/// </summary>
public string QualifiedCanonicalName
{
get
{
if (Material == Models.Material.B)
{
return CanonicalName;
}
else
{
return String.Format("{0}-{1}", Material.ToString(), CanonicalName);
}
}
}
public bool AlwaysPrintLimits { get; private set; }
public Materials Material { get; private set; }
public Material Material { get; private set; }
#endregion
@ -185,15 +205,11 @@ namespace zaaReloaded2.Models
/// </summary>
public LabItem() { }
/// <summary>
/// Creates a LabItem object from a given Lauris output.
/// </summary>
/// <param name="laurisString">Lauris output to parse.</param>
public LabItem(string laurisString)
:this()
{
Lauris = laurisString;
ParseLauris();
DetectMaterial();
}
/// <summary>
@ -203,15 +219,27 @@ namespace zaaReloaded2.Models
/// to always print the reference interval).
/// </summary>
/// <param name="laurisString">Lauris output to parse.</param>
/// <param name="dictionary">ParameterDictionary that is used
/// <param name="parameterDictionary">ParameterDictionary that is used
/// to look up the canonical name, material type, and whether or
/// not to always print the reference interval</param>
public LabItem(string laurisString, Dictionaries.ParameterDictionary dictionary)
public LabItem(string laurisString,
Dictionaries.ParameterDictionary parameterDictionary,
Dictionaries.UnitDictionary unitDictionary)
: this(laurisString)
{
CanonicalName = dictionary.GetCanonicalName(Name);
AlwaysPrintLimits = dictionary.GetForceReferenceDisplay(Name);
Material = dictionary.GetMaterial(Name);
if (parameterDictionary != null)
{
CanonicalName = parameterDictionary.GetCanonicalName(Name);
AlwaysPrintLimits = parameterDictionary.GetForceReferenceDisplay(Name);
}
else
{
CanonicalName = Name;
}
if (unitDictionary != null)
{
Unit = unitDictionary.TranslateLaurisUnit(Unit);
}
}
#endregion
@ -222,7 +250,7 @@ namespace zaaReloaded2.Models
/// Parses the original Lauris string contained in
/// <see cref="Lauris"/>.
/// </summary>
private void ParseLauris()
void ParseLauris()
{
// Examples of Lauris output strings:
// "Natrium: 139 [135 - 145] mmol/l"
@ -294,6 +322,32 @@ namespace zaaReloaded2.Models
}
}
/// <summary>
/// Analyses the Lauris name for a material abbreviation.
/// If the parameter does not refer to blood (serum, whole
/// blood, etc.), Lauris appends an abbreviation in parentheses
/// to the parameter name.
/// </summary>
/// <example>
/// Gesamt-Eiweiss (SU), Albumin (SU)/die, Gesamt-Eiweiss (PU)
/// </example>
void DetectMaterial()
{
Match m = _materialRegex.Match(Name);
if (m.Success)
{
switch (m.Groups["material"].Value.ToUpper())
{
case "SU":
Material = Models.Material.SU;
break;
case "PU":
Material = Models.Material.U;
break;
}
}
}
#endregion
#region Fields
@ -301,6 +355,7 @@ namespace zaaReloaded2.Models
double _numericalValue;
double _lowerLimit;
double _upperLimit;
static readonly Regex _materialRegex = new Regex(@"\((?<material>(SU|PU))\)");
#endregion
}

View File

@ -0,0 +1,129 @@
/* LaurisParagraph.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace zaaReloaded2.Models
{
/// <summary>
/// Parses an entire Lauris paragraph (such as "Klinische Chemie: ...")
/// and creates a list of <see cref="LabItem"/>s.
/// </summary>
public class LaurisParagraph
{
#region Public properties
/// <summary>
/// Gets a collection of <see cref="LabItem"/>s found in this paragraph.
/// </summary>
public IDictionary<string, LabItem> Items { get; private set; }
/// <summary>
/// Gets the caption that was extracted from the <see cref="OriginalParagraph"/>,
/// e.g. "Klin. Chemie" in "Klin. Chemie: Natrium ...".
/// </summary>
public string Caption { get; private set; }
/// <summary>
/// Gets the original paragraph that this object was constructed from.
/// </summary>
public string OriginalParagraph { get; private set; }
/// <summary>
/// Is true if the <see cref="OriginalParagraph"/> matches the expected
/// format and contains <see cref="LabItem"/>s.
/// </summary>
public bool IsLaurisParagraph { get; private set; }
#endregion
#region Constructor
public LaurisParagraph(string paragraph)
{
OriginalParagraph = paragraph;
Parse();
}
/// <summary>
/// Constructs a <see cref="LaurisParagraph"/> object from a given
/// Lauris paragraph, using a <paramref name="parameterDictionary"/>
/// and a <paramref name="unitDictionary"/> to translate the individual
/// items' properties.
/// </summary>
/// <param name="paragraph">lauris paragraph to parse.</param>
/// <param name="parameterDictionary">ParameterDictionary that contains
/// canonical names and material types.</param>
/// <param name="unitDictionary">Unit dictionary that contains canonical
/// unit names.</param>
public LaurisParagraph(string paragraph,
Dictionaries.ParameterDictionary parameterDictionary,
Dictionaries.UnitDictionary unitDictionary)
{
OriginalParagraph = paragraph;
_parameterDictionary = parameterDictionary;
_unitDictionary = unitDictionary;
Parse();
}
#endregion
#region Private methods
/// <summary>
/// Attempts to parse a Lauris paragraph.
/// </summary>
void Parse()
{
Match m = _expectedFormat.Match(OriginalParagraph);
if (m.Success)
{
Items = new Dictionary<string, LabItem>();
if (m.Groups["caption"].Success)
{
Caption = m.Groups["caption"].Value.Trim(new char[] {' ', ':'});
}
foreach (Capture itemCapture in m.Groups["items"].Captures)
{
LabItem i = new LabItem(itemCapture.Value, _parameterDictionary, _unitDictionary);
Items.Add(i.QualifiedCanonicalName, i);
}
IsLaurisParagraph = Items.Count > 0;
}
else
{
IsLaurisParagraph = false;
}
}
#endregion
#region Fields
static readonly Regex _expectedFormat = new Regex(@"(?<caption>[^:]+:\s*)?(?<items>[^:]+:\s*[^;]+;)*");
Dictionaries.ParameterDictionary _parameterDictionary;
Dictionaries.UnitDictionary _unitDictionary;
#endregion
}
}

View File

@ -26,34 +26,32 @@ namespace zaaReloaded2.Models
/// <summary>
/// Enumerates the known materials.
/// </summary>
enum Materials
public enum Material
{
[Description("Serum")]
/// Serum
S,
[Description("Plasma")]
/// Plasma
P,
[Description("EDTA-Blut")]
/// EDTA-Blut
E,
[Description("BGA")]
/// BGA
BGA,
[Description("Zitrat")]
/// Zitrat-Blut
Z,
[Description("Laktat")]
/// Laktat-Blut
L,
[Description("Blut")]
/// Blood
B,
[Description("Urin")]
/// Urin (Spoturin)
/// Urine (spot)
U,
[Description("Sammelurin")]
/// Sammelurin
/// Collected urine
SU,
[Description("Sondermaterial")]
/// Sondermaterial
X
}
/// <summary>
/// Contains factory methods to create Material values.
/// </summary>
public static class MaterialFactory
{
/// <summary>
/// Creates a <see cref="Material"/> value from an abbreviation of a material.
/// </summary>
/// <param name="abbreviation">Abbreviation of a material.</param>
/// <returns>Materials value.</returns>
public static Material FromAbbreviation(string abbreviation)
{
return (Material)Enum.Parse(typeof(Material), abbreviation, true);
}
}
}

View File

@ -165,7 +165,8 @@
<Compile Include="Dictionaries\ParameterDictionary.cs" />
<Compile Include="Dictionaries\UnitDictionary.cs" />
<Compile Include="Models\LabItem.cs" />
<Compile Include="Models\Materials.cs" />
<Compile Include="Models\LaurisParagraph.cs" />
<Compile Include="Models\Material.cs" />
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>