public void exportlinkData()
        {
            String filename     = "health_data.csv";
            String filefullName = Path.Combine(this.exportFolder, filename);


            FileStream fileStream = new FileStream(filefullName, FileMode.Create);

            fileStream.Close();

            using (StreamWriter writer = new StreamWriter(filefullName))
            {
                writer.WriteLine(HealthCareData.toCVSHeader());
                HealthCareData healthCareData = null;



                foreach (var item in seq_healthCareDataMap)
                {
                    healthCareData = item.Value;

                    if (healthCareData.icd10_principle_dx.Contains("V") || healthCareData.icd10_external_cause.Contains("V"))
                    {
                        writer.WriteLine(healthCareData.toCVS());
                    }
                }
            }

            addtextln("Export Link Data Completed, ROW :" + seq_healthCareDataMap.Count);
        }
        private void joinDiganosis_OPD()
        {
            HealthCareData healthCareData = null;

            addtextln("Read OPD");
            opdDataIndex = Utils.setupDataDic(opdList[0]);
            string diagType = "";
            string icd10    = "";

            for (int index = 1; index < opdList.Count; index++)
            {
                String   line = opdList[index];
                string[] data = line.Split(',');
                String   seq  = Utils.getVal("SEQ", data, opdDataIndex);

                if (seq_healthCareDataMap.ContainsKey(seq))
                {
                    healthCareData = seq_healthCareDataMap[seq];

                    diagType = Utils.getVal("DIAGTYPE", data, opdDataIndex);
                    icd10    = Utils.getVal("DIAGCODE", data, opdDataIndex);
                    healthCareData.setICD10(diagType, icd10);
                }
            }
        }
        private void joinDeath()
        {
            //HOSPCODE	PID	HOSPDEATH	AN	SEQ	DDEATH	CDEATH_A	CDEATH_B	CDEATH_C	CDEATH_D	ODISEASE	CDEATH	PREGDEATH	PDEATH

            if (deathList.Count() == 0)
            {
                return;
            }

            HealthCareData healthCareData = null;

            addtextln("Read Death");
            deathDataIndex = Utils.setupDataDic(deathList[0]);
            String seq = "";
            String pid = "";
            String an  = "";

            for (int index = 1; index < deathList.Count; index++)
            {
                String   line = deathList[index];
                string[] data = line.Split(',');
                seq = Utils.getVal("SEQ", data, deathDataIndex);

                if (seq_healthCareDataMap.ContainsKey(seq))
                {
                    healthCareData = seq_healthCareDataMap[seq];

                    pushDeathData(healthCareData, data);
                }

                pid = Utils.getVal("PID", data, deathDataIndex);

                if (pid_healthCareDataMap.ContainsKey(pid))
                {
                    List <HealthCareData> careDatas = pid_healthCareDataMap[pid];

                    careDatas.ForEach(delegate(HealthCareData careData)
                    {
                        pushDeathData(careData, data);
                    });
                }

                an = Utils.getVal("AN", data, deathDataIndex);

                if (an_healthCareDataMap.ContainsKey(an))
                {
                    List <HealthCareData> careDatas = an_healthCareDataMap[an];

                    careDatas.ForEach(delegate(HealthCareData careData)
                    {
                        pushDeathData(careData, data);
                    });
                }
            }
        }
 private void pushDeathData(HealthCareData healthCareData, string[] data)
 {
     //HOSPCODE	PID	HOSPDEATH	AN	SEQ	DDEATH	CDEATH_A	CDEATH_B	CDEATH_C	CDEATH_D	ODISEASE	CDEATH	PREGDEATH	PDEATH
     healthCareData.hospdeath = Utils.getVal("HOSPDEATH", data, deathDataIndex);
     healthCareData.ddeath    = Utils.getVal("DDEATH", data, deathDataIndex);
     healthCareData.cdeath_a  = Utils.getVal("CDEATH_A", data, deathDataIndex);
     healthCareData.cdeath_b  = Utils.getVal("CDEATH_B", data, deathDataIndex);
     healthCareData.cdeath_c  = Utils.getVal("CDEATH_C", data, deathDataIndex);
     healthCareData.cdeath_d  = Utils.getVal("CDEATH_D", data, deathDataIndex);
     healthCareData.odisease  = Utils.getVal("ODISEASE", data, deathDataIndex);
     healthCareData.cdeath    = Utils.getVal("CDEATH", data, deathDataIndex);
     healthCareData.pregdeath = Utils.getVal("PREGDEATH", data, deathDataIndex);
     healthCareData.pdeath    = Utils.getVal("PDEATH", data, deathDataIndex);
 }
        private void joinService()
        {
            serviceDataIndex = Utils.setupDataDic(serviceList[0]);
            addtextln("Read Service");

            HealthCareData healthCareData = null;

            for (int index = 1; index < serviceList.Count; index++)
            {
                healthCareData = new HealthCareData();
                String   line = serviceList[index];
                string[] data = line.Split(',');

                String seq       = Utils.getVal("SEQ", data, serviceDataIndex);
                String pid       = Utils.getVal("PID", data, serviceDataIndex);
                String date_serv = Utils.getVal("DATE_SERV", data, serviceDataIndex);

                healthCareData.seq       = seq;
                healthCareData.pid       = pid;
                healthCareData.hospcode  = Utils.getVal("HOSPCODE", data, serviceDataIndex);
                healthCareData.hn        = Utils.getVal("HN", data, serviceDataIndex);
                healthCareData.date_serv = date_serv;
                healthCareData.time_serv = Utils.getVal("TIME_SERV", data, serviceDataIndex);
                healthCareData.location  = Utils.getVal("LOCATION", data, serviceDataIndex);

                healthCareData.type_in       = Utils.getVal("TYPEIN", data, serviceDataIndex);
                healthCareData.refer_in_hosp = Utils.getVal("REFERINHOSP", data, serviceDataIndex);
                healthCareData.cause_in      = Utils.getVal("CAUSEIN", data, serviceDataIndex);
                healthCareData.typeout       = Utils.getVal("TYPEOUT", data, serviceDataIndex);

                seq_healthCareDataMap.Add(seq, healthCareData);

                if (!pid_healthCareDataMap.ContainsKey(pid))
                {
                    List <HealthCareData> careData = new List <HealthCareData>();
                    careData.Add(healthCareData);

                    pid_healthCareDataMap.Add(pid, careData);
                }
                else
                {
                    List <HealthCareData> careData = pid_healthCareDataMap[pid];
                    careData.Add(healthCareData);
                }
                healthCareDataList.Add(healthCareData);
            }
        }
 private void pushAccidentData(HealthCareData healthCareData, string[] data)
 {
     healthCareData.aetype        = Utils.getVal("AETYPE", data, accidentDataIndex);
     healthCareData.aeplace       = Utils.getVal("AEPLACE", data, accidentDataIndex);
     healthCareData.typein_ae     = Utils.getVal("TYPEIN_AE", data, accidentDataIndex);
     healthCareData.traffic       = Utils.getVal("TRAFFIC", data, accidentDataIndex);
     healthCareData.vehicle       = Utils.getVal("VEHICLE", data, accidentDataIndex);
     healthCareData.alcohol       = Utils.getVal("ALCOHOL", data, accidentDataIndex);
     healthCareData.nacrotic_drug = Utils.getVal("NACROTIC_DRUG", data, accidentDataIndex);
     healthCareData.belt          = Utils.getVal("BELT", data, accidentDataIndex);
     healthCareData.helmet        = Utils.getVal("HELMET", data, accidentDataIndex);
     healthCareData.airway        = Utils.getVal("AIRWAY", data, accidentDataIndex);
     healthCareData.stopbleed     = Utils.getVal("STOPBLEED", data, accidentDataIndex);
     healthCareData.splint        = Utils.getVal("SPLINT", data, accidentDataIndex);
     healthCareData.fluid         = Utils.getVal("FLUID", data, accidentDataIndex);
     healthCareData.urgency       = Utils.getVal("URGENCY", data, accidentDataIndex);
     healthCareData.coma_eye      = Utils.getVal("COMA_EYE", data, accidentDataIndex);
     healthCareData.coma_speak    = Utils.getVal("COMA_SPEAK", data, accidentDataIndex);
     healthCareData.coma_movement = Utils.getVal("COMA_MOVEMENT", data, accidentDataIndex);
 }
        private void joinAccident()
        {
            //PID	SEQ	DATETIME_SERV	DATETIME_AE	AETYPE	AEPLACE	TYPEIN_AE	TRAFFIC	VEHICLE	ALCOHOL	NACROTIC_DRUG
            //BELT	HELMET	AIRWAY	STOPBLEED	SPLINT	FLUID	URGENCY	COMA_EYE	COMA_SPEAK	COMA_MOVEMENT

            HealthCareData healthCareData = null;

            addtextln("Read Accident");
            accidentDataIndex = Utils.setupDataDic(accidentList[0]);
            String seq = "";
            String pid = "";

            for (int index = 1; index < accidentList.Count; index++)
            {
                String   line = accidentList[index];
                string[] data = line.Split(',');
                seq = Utils.getVal("SEQ", data, accidentDataIndex);

                if (seq_healthCareDataMap.ContainsKey(seq))
                {
                    healthCareData = seq_healthCareDataMap[seq];

                    pushAccidentData(healthCareData, data);
                }

                pid = Utils.getVal("PID", data, accidentDataIndex);

                if (pid_healthCareDataMap.ContainsKey(pid))
                {
                    List <HealthCareData> careDatas = pid_healthCareDataMap[pid];

                    careDatas.ForEach(delegate(HealthCareData careData)
                    {
                        pushAccidentData(careData, data);
                    });
                }
            }
        }
        private void calcualateData()
        {
            HealthCareData healthCareData   = null;
            String         typeout          = "";
            String         discharge_status = "";

            foreach (HealthCareData item in healthCareDataList)
            {
                healthCareData = item;

                String date_serv  = healthCareData.date_serv;
                String birth_date = healthCareData.birthdate;



                try
                {
                    int year_serv  = int.Parse(date_serv.Substring(0, 4));
                    int year_birth = int.Parse(birth_date.Substring(0, 4));

                    int age = year_serv - year_birth;

                    healthCareData.age_at_service = age;
                }
                catch (Exception e)
                {
                    // Console.WriteLine(date_serv + "Serve " + birth_date + "Birth " + e.ToString());
                }

                typeout          = healthCareData.typeout;
                discharge_status = healthCareData.discharge_status;
                int    typeout_int   = 0;
                int    discharge_int = 0;
                string CDEATH        = healthCareData.cdeath;
                try
                {
                    if (typeout.Length > 0)
                    {
                        typeout_int = int.Parse(typeout);
                    }

                    if (discharge_status.Length > 0)
                    {
                        discharge_int = int.Parse(discharge_status);
                    }
                }
                catch (Exception e)
                {
                    // Console.WriteLine(e.ToString() + "typeout " + typeout + " discharge_status " + discharge_status);
                }

                if ((typeout_int >= 4 && typeout_int <= 6) || (discharge_int == 8 || discharge_int == 9) || CDEATH != null)
                {
                    healthCareData.deathstatus = "1";

                    if (healthCareData.icd10_principle_dx.Contains("V") || healthCareData.icd10_external_cause.Contains("V"))
                    {
                        joinDeathList.Add(healthCareData);
                    }
                }
                else
                {
                    healthCareData.deathstatus = "0";
                }
            }
            addtextln("Death Count from Health Data: " + joinDeathList.Count());
        }
        private void joinDiganosis_IPD()
        {
            HealthCareData healthCareData = null;

            addtextln("Read IPD");
            ipdDataIndex = Utils.setupDataDic(ipdList[0]);
            String diagType = "";
            String icd10    = "";
            String date;

            for (int index = 1; index < ipdList.Count; index++)
            {
                String   line = ipdList[index];
                string[] data = line.Split(',');

                String pid = Utils.getVal("PID", data, ipdDataIndex);
                String an  = Utils.getVal("AN", data, ipdDataIndex);


                diagType = Utils.getVal("DIAGTYPE", data, ipdDataIndex);
                icd10    = Utils.getVal("DIAGCODE", data, ipdDataIndex);
                date     = Utils.getVal("DATETIME_ADMIT", data, ipdDataIndex);


                if (an_healthCareDataMap.ContainsKey(an))
                {
                    List <HealthCareData> careDatas = an_healthCareDataMap[an];

                    if (careDatas.Count == 1)
                    {
                        healthCareData = careDatas[0];
                        healthCareData.setICD10(diagType, icd10);
                    }
                    else if (careDatas.Count > 1)
                    {
                        careDatas.ForEach(delegate(HealthCareData careData)
                        {
                            healthCareData = careData;
                            if (healthCareData.checkSameDataByDate(date))
                            {
                                healthCareData.setICD10(diagType, icd10);
                            }
                        });
                    }
                }
                else if (pid_healthCareDataMap.ContainsKey(pid))
                {
                    List <HealthCareData> careDatas = pid_healthCareDataMap[pid];

                    if (careDatas.Count == 1)
                    {
                        healthCareData = careDatas[0];
                        healthCareData.setICD10(diagType, icd10);
                    }
                    else if (careDatas.Count > 1)
                    {
                        careDatas.ForEach(delegate(HealthCareData careData)
                        {
                            healthCareData = careData;
                            if (healthCareData.checkSameDataByDate(date))
                            {
                                healthCareData.setICD10(diagType, icd10);
                            }
                        });
                    }
                }
            }
        }
        private void joinAdmission()
        {
            HealthCareData healthCareData = null;

            addtextln("Read Admit");
            admidDataIndex = Utils.setupDataDic(admidList[0]);
            for (int index = 1; index < admidList.Count; index++)
            {
                String   line = admidList[index];
                string[] data = line.Split(',');

                String seq        = Utils.getVal("SEQ", data, admidDataIndex);
                String pid        = Utils.getVal("PID", data, admidDataIndex);
                String date_admit = Utils.getVal("DATETIME_ADMIT", data, admidDataIndex);
                String date_serv  = date_admit.Substring(0, 8);
                String time_serv  = date_admit.Substring(8, 6);

                healthCareData = new HealthCareData();

                healthCareData.seq       = seq;
                healthCareData.pid       = pid;
                healthCareData.hospcode  = Utils.getVal("HOSPCODE", data, serviceDataIndex);
                healthCareData.hn        = Utils.getVal("HN", data, serviceDataIndex);
                healthCareData.date_serv = date_serv;
                healthCareData.time_serv = time_serv;


                healthCareData.type_in       = Utils.getVal("TYPEIN", data, serviceDataIndex);
                healthCareData.refer_in_hosp = Utils.getVal("REFERINHOSP", data, serviceDataIndex);
                healthCareData.cause_in      = Utils.getVal("CAUSEIN", data, serviceDataIndex);


                healthCareData.an = Utils.getVal("AN", data, admidDataIndex);
                healthCareData.discharge_status = Utils.getVal("DISCHSTATUS", data, admidDataIndex);
                healthCareData.date_admit       = date_admit;
                String an = Utils.getVal("AN", data, admidDataIndex);


                if (seq_healthCareDataMap.ContainsKey(seq))
                {
                    healthCareData    = seq_healthCareDataMap[seq];
                    healthCareData.an = Utils.getVal("AN", data, admidDataIndex);
                    healthCareData.discharge_status = Utils.getVal("DISCHSTATUS", data, admidDataIndex);
                    healthCareData.date_admit       = date_admit;
                }
                else
                {
                    seq_healthCareDataMap.Add(seq, healthCareData);
                    healthCareDataList.Add(healthCareData);


                    if (pid_healthCareDataMap.ContainsKey(pid))
                    {
                        List <HealthCareData> careData = pid_healthCareDataMap[pid];
                        careData.Add(healthCareData);
                    }
                    else
                    {
                        List <HealthCareData> careData = new List <HealthCareData>();
                        careData.Add(healthCareData);
                        pid_healthCareDataMap.Add(pid, careData);
                    }
                }


                if (an_healthCareDataMap.ContainsKey(an))
                {
                    List <HealthCareData> careData = an_healthCareDataMap[an];
                    careData.Add(healthCareData);
                }
                else
                {
                    List <HealthCareData> careData = new List <HealthCareData>();
                    careData.Add(healthCareData);
                    an_healthCareDataMap.Add(an, careData);
                }
            }
        }