Question:
How can we use HL7Spy to find the last set of known allergies for each patient in a set of messages?
Answer:
The best way is to write a custom function that remembers the last set of allergies for each patient. Then in the OnFinished function we print out all patients with their last set of known allergies.
string _fileName = @"c:\temp\_test.txt"; Dictionary<string,Patient> _data = new Dictionary<string,Patient>(10000); public class Patient { public Patient(string patientId) { Allergies = new HashSet<string>(); PatientId = patientId; } public HashSet<string> Allergies; public string PatientId; } public override void Run() { // Get an HL7 Message in parsed format HL7Message message = GetParsedMessage(); MSH msh = message.Segments.First<MSH>(); if(msh==null || msh.MessageType_09.TriggerEvent_02.Value!="A08") return; // not an ADT^A08 message PID pid = message.Segments.First<PID>(); if(pid==null) return; // no pid segment List<AL1> patientAllergies = message.Segments.OfType<AL1>(); if(patientAllergies.Count==0) return; // no allergies string patientId = pid.PatientIdentifierList_03.First.ToString(); Patient pat; if(!_data.TryGetValue(patientId,out pat)) { pat = new Patient(patientId); _data.Add(patientId,pat); } pat.Allergies.Clear(); // loop through all AL1 segments foreach(AL1 al1 in patientAllergies) { pat.Allergies.Add(al1.AllergenTypeCode_02.ToString()); } } // Called once after the last message has been processed. // It is a good place to perform cleanup and to report information. // Always called from the UI thread. public override void OnFinish() { // to figure out the distribution of all allergies Dictionary<string, int> allergies = new Dictionary<string,int>(1000); // write the data out to a file using(System.IO.StreamWriter wr = new System.IO.StreamWriter(_fileName)) { wr.WriteLine("Patient ID vs Allergy for {0} patient samples",_data.Count); wr.WriteLine(); foreach(Patient p in _data.Values.OrderByDescending(p=>p.Allergies.Count)) { wr.Write(p.PatientId); wr.Write(','); wr.Write(p.Allergies.Count); foreach(string s in p.Allergies) { wr.Write(','); wr.Write(s); // calculate the total number of allergy types for the given set of patients int frequency=0; if(!allergies.TryGetValue(s,out frequency)) { allergies.Add(s,1); } else { allergies[s]=++frequency; } } wr.WriteLine(); } wr.WriteLine(); wr.WriteLine(); wr.WriteLine("Allergy distribution for {0} patient samples.",_data.Count); wr.WriteLine("Number of distinct allergies is {0}.",allergies.Count); wr.WriteLine(); foreach(KeyValuePair<string,int> d in allergies) { wr.Write(d.Key); wr.Write(','); wr.Write(d.Value); wr.WriteLine(); } } // launch notepad to display the file. System.Diagnostics.Process.Start("Notepad",_fileName); }