public Pair <int, List <IAnswer> > ExtractAnswers(ICodebook codebook, DataTable answers, IEnumerable <ColumnInfo> journalInfoColumns)
        {
            var results = new List <IAnswer>();

            var missingVars = new List <string>();

            foreach (DataRow row in answers.Rows)
            {
                Answer answer    = new Answer();
                var    variables = new List <IVariable>();

                // add journalInfo
                foreach (var info in journalInfoColumns)
                {
                    var col         = info.Column;
                    var columnType  = info.Datatype;
                    var columnWidth = info.ColumnWidth;
                    if (answers.Columns[col] != null)
                    {
                        var value = row[col].ToString();
                        variables.Add(new CodeAnswer(new Code(0, 0, 0, 0, col, col, "", columnType, col, columnWidth), value));
                    }
                }

                // add answers
                foreach (var code in codebook.Codes)  // read each column in row
                {
                    if (answers.Columns[code.Name] != null)
                    {
                        var       value      = row[code.Name].ToString();
                        IVariable codeAnswer = new CodeAnswer(code, value);
                        variables.Add(codeAnswer);
                    }
                    else
                    {
                        var miss = "Missing var: {0} - survey: {1}  row,col,sur,qId: {2},{3},{1},{4}  Q:{5}".F(code.Name, codebook.Id, code.Row, code.Column, code.QuestionId, code.QuestionNumber);
                        if (!missingVars.Contains(miss))
                        {
                            missingVars.Add(miss);
                        }
                    }
                }
                answer.Variables      = variables;
                answer.Id             = codebook.Id;
                answer.AnswerMetadata = AnswerMetadata.GetJournalInfo(row);
                // Key to group by (pid, follow_up)
                answer.SetKey(answer.AnswerMetadata.Pid, answer.AnswerMetadata.FollowUp);
                answer.Projekt = answer.AnswerMetadata.Projekt;
                results.Add(answer);
            }
            foreach (var miss in missingVars)
            {
                Console.Out.WriteLine(miss);
            }

            results = results.OrderBy(r => r.Key).ToList();
            return(new Pair <int, List <IAnswer> >(codebook.Id, results));
        }
예제 #2
0
        private void AddExportInfo(AnswerMetadata answerMetadata, bool exportedToSpss)
        {
            if (!_answerInfoCollection.ContainsKey(answerMetadata.Pid))
            {
                _answerInfoCollection.Add(answerMetadata.Pid, new AnswerInfo(answerMetadata));
            }

            _answerInfoCollection[answerMetadata.Pid].SPSS = exportedToSpss;
        }
예제 #3
0
        private static IEnumerable <ICode> GetColumnDefinitions(Dictionary <int, ICodebook> codebooks)
        {
            var columns = new List <ICode>();

            foreach (var columnInfo in AnswerMetadata.JournalInfoColumns())
            {
                var columnName  = columnInfo.Column;
                var columnType  = columnInfo.Datatype;
                var columnWidth = columnInfo.ColumnWidth;
                var col         = new Code(0, 0, 0, 0, "", columnName, "", columnType, "", columnWidth);
                columns.Add(col);
            }

            columns.AddRange(codebooks.Values.SelectMany(cb => cb.Codes));
            return(columns);
        }
예제 #4
0
        private void AddExportInfo(AnswerMetadata answerMetadata, int surveyId)
        {
            if (!_answerInfoCollection.ContainsKey(answerMetadata.Pid))
            {
                _answerInfoCollection.Add(answerMetadata.Pid, new AnswerInfo(answerMetadata));
            }

            if (2 == surveyId)
            {
                _answerInfoCollection[answerMetadata.Pid].Besvarelsesdato_CBCL = answerMetadata.Besvarelsesdato;
            }
            else
            {
                _answerInfoCollection[answerMetadata.Pid].Besvarelsesdato_TRF = answerMetadata.Besvarelsesdato;
            }
        }
        private AnswerMetadata PopulateJournalInfo(DataRow row)
        {
            var journalInfo = new AnswerMetadata();

            journalInfo.Ssghafd         = row["ssghafd"].ToString();
            journalInfo.Ssghnavn        = row["ssghnavn"].ToString();
            journalInfo.Safdnavn        = row["safdnavn"].ToString();
            journalInfo.Pid             = row.ToString("pid");
            journalInfo.Projekt         = row.ToString("projekt");
            journalInfo.Pkoen           = (Gender)row.ToInt("pkoen");
            journalInfo.Palder          = row.ToInt("palder");
            journalInfo.Pnation         = row.ToString("pnation");
            journalInfo.Besvarelsesdato = StringHelperExtensions.ToDate(row["besvarelsesdato"].ToString());
            journalInfo.Pfoedt          = row["pfoedt"].ToString();
            journalInfo.FollowUp        = row["follow_up"].ToString();
            return(journalInfo);
        }
예제 #6
0
 public AnswerInfo(AnswerMetadata answerMetadata)
 {
     Id                   = answerMetadata.Id;
     Pid                  = answerMetadata.Pid;
     this.Birthdate       = answerMetadata.Pfoedt;
     this.Pfoedt          = answerMetadata.Pfoedt;
     this.Palder          = answerMetadata.Palder;
     this.Pkoen           = answerMetadata.Pkoen;
     this.Pnation         = answerMetadata.Pnation;
     this.Projekt         = answerMetadata.Projekt;
     this.JournalId       = answerMetadata.JournalId;
     this.Safdnavn        = answerMetadata.Safdnavn;
     this.Ssghafd         = answerMetadata.Ssghafd;
     this.Ssghnavn        = answerMetadata.Ssghnavn;
     this.Besvarelsesdato = answerMetadata.Besvarelsesdato;
     this.FollowUp        = answerMetadata.FollowUp;
 }
예제 #7
0
        public static IEnumerable <AnswerInfo> GetJournalInfos(DataTable table, int surveyId)
        {
            var infos = new List <AnswerInfo>();

            foreach (DataRow row in table.Rows)
            {
                var answerInfo = new AnswerInfo(AnswerMetadata.GetJournalInfo(row));
                if (surveyId == 2)
                {
                    answerInfo.Besvarelsesdato_CBCL = answerInfo.Besvarelsesdato;
                }
                else
                {
                    answerInfo.Besvarelsesdato_TRF = answerInfo.Besvarelsesdato;
                }

                infos.Add(answerInfo);
            }

            return(infos);
        }
        private AnswerMetadata ParseRow(XElement row)
        {
            var fields = row.Elements("field");

            var id                       = _xmlHelper.GetIntAttributeValue(fields, "id");
            var journalId                = _xmlHelper.GetIntAttributeValue(fields, "journal_id");
            var ssghafd                  = fields.Single(e => e.HasAttributeValue("ssghafd")).Value;
            var ssghnavn                 = fields.Single(e => e.HasAttributeValue("ssghnavn")).Value;
            var safdnavn                 = fields.Single(e => e.HasAttributeValue("safdnavn")).Value;
            var pid                      = fields.Single(e => e.HasAttributeValue("pid")).Value;
            var projekt                  = fields.Single(e => e.HasAttributeValue("projekt")).Value;
            var pkoen                    = _xmlHelper.GetAttributeGender(fields, "pkoen");
            var palder                   = _xmlHelper.GetIntAttributeValue(fields, "palder");
            var pkoen_datatype           = _xmlHelper.GetAttributeDatatype(fields, "pkoen_datatype");
            var palder_datatype          = _xmlHelper.GetAttributeDatatype(fields, "palder_datatype");
            var pnation                  = _xmlHelper.GetAttributeValue(fields, "pnation");
            var pnation_datatype         = _xmlHelper.GetAttributeDatatype(fields, "pnation_datatype");
            var besvarelsesdato          = _xmlHelper.GetAttributeDateTime(fields, "besvarelsesdato");
            var pfoedt                   = _xmlHelper.GetAttributeDateTime(fields, "pfoedt");
            var besvarelsesdato_datatype = _xmlHelper.GetAttributeDatatype(fields, "besvarelsesdato_datatype");
            var pfoedt_datatype          = _xmlHelper.GetAttributeDatatype(fields, "pfoedt_datatype");

            var journalInfo = new AnswerMetadata()
            {
                Id        = id,
                JournalId = journalId,
                Ssghafd   = ssghafd,
                Ssghnavn  = ssghnavn,
                Safdnavn  = safdnavn,
                Pid       = pid,
                Projekt   = projekt,
                Pkoen     = pkoen,
                Palder    = palder,
                Pnation   = pnation,
                Pfoedt    = pfoedt.ToString(),
            };

            return(journalInfo);
        }
예제 #9
0
        private void importCsvButton_Click(object sender, EventArgs e)
        {
            var dir = FindCodebooks();

            if (dir.Contains("not found"))
            {
                Log("Error: Codebooks could not be found. Check locations, folder 'Codebooks' must be in current directory.");
                //throw new ApplicationException("Codebooks could not be found");
            }

            var codebookFiles = new List <String> {
                @"\codebook_cc.xml", @"\codebook_ccy.xml",
                @"\codebook_ct.xml", @"\codebook_tt.xml", @"\codebook_ycy.xml"
            };

            var fullFilePaths = codebookFiles.Select(f => dir + f);

            CodeBookXmlLoader codebookLoader;

            try
            {
                codebookLoader = new CodeBookXmlLoader(fullFilePaths);
                _codebooks     = codebookLoader.Read();
            } catch (Exception ex)
            {
                Log("Fejl indlæsning kodebøger: " + ex.Message);
                Log(ex.StackTrace);
                throw;
            }

            Log("Indlæste kodebøger: " + codebookFiles.Aggregate((a, b) => a + ", " + b));

            // read answers
            var answersLoader = new AnswersCsvLoader();

            Log("Indlæser svar i CSV-format");
            Dictionary <int, DataTable> answers;

            try
            {
                answers = answersLoader.ReadCsvAnswers(_files);
            }
            catch (Exception ex)
            {
                Log("Fejl indlæsning svar: " + ex.Message);
                Log(ex.StackTrace);
                throw;
            }


            var answerTables = answers.GroupBy(a => a.Key);

            foreach (var grouping in answerTables)
            {
                var surveyId     = grouping.Key;
                var journalInfos = grouping.SelectMany(group => AnswerInfo.GetJournalInfos(group.Value, surveyId));
                foreach (var journalInfo in journalInfos)
                {
                    AddExportInfo(journalInfo, surveyId);
                }
            }


            var journalInfoColumns = AnswerMetadata.JournalInfoColumns();

            var mixer            = new CodebookAnswerMixer(_codebooks.Values);
            var answersPerSurvey = new Dictionary <int, List <IAnswer> >();

            Log("Importerer svar...");

            int codebookId = 0;

            try
            {
                foreach (var pair in _codebooks)
                {
                    codebookId = pair.Key; //.ToString();
                    ICodebook codebook = pair.Value;
                    if (answers.ContainsKey(codebookId))
                    {
                        var answersTable = answers[codebookId];
                        // get answer table and codebook with same surveyId. Just for trying out
                        var answersForSurvey = mixer.ExtractAnswers(codebook, answersTable, journalInfoColumns);
                        answersPerSurvey.Add(answersForSurvey.First, answersForSurvey.Second);
                    }
                }
            } catch (Exception ex)
            {
                Log("Fejl i mix: " + ex.Message);
                Log("KodebogID: " + codebookId);
                Log(ex.StackTrace);
                throw;
            }

            try
            {
                _importedAnswers = mixer.CollectAnswersByJournal(answersPerSurvey);
            } catch (Exception ex)
            {
                Log("Fejl saml svar: " + ex.Message);
                Log(ex.StackTrace);
                throw;
            }

            Log("Svarene er importeret.");

            foreach (var answerBook in _importedAnswers)
            {
                foreach (var journalInfo in answerBook.AnswerMetadataList)
                {
                    AddExportInfo(new AnswerInfo(journalInfo), true);
                }
            }

            importCsvButton.Enabled = false;
            saveButton.Enabled      = true;
        }