Beispiel #1
0
        private void QuestionAddChoiceLine(QuestionData value)
        {
            QuestionReader.QuestionBaseTmp question;
            if (_associationQuestion != null)
            {
                if (_associationQuestion.Complete)
                {
                    throw new PBFileException($"unknow response, association question is complete, line {value.LineNumber} file \"{value.Filename}\"", value.File, value.LineNumber);
                }
                question = _associationQuestion;
            }
            else if (_question != null)
            {
                question = _question;
            }
            else
            {
                throw new PBFileException($"unknow question, line {value.LineNumber} file \"{value.Filename}\"", value.File, value.LineNumber);
            }

            if (question.ChoiceLineCount > _maxLinesPerChoice - 1)
            {
                throw new PBFileException($"to many lines ({question.ChoiceLineCount}) for response \"{value.TrimedLine}\" line {value.LineNumber} file \"{value.Filename}\"", value.File, value.LineNumber);
            }
            question.Choices[question.Choices.Count - 1] += " " + value.TrimedLine;
            question.ChoiceLineCount++;
        }
Beispiel #2
0
        private void _TraceUnknowValue(QuestionData value)
        {
            string label = null;

            if (_questionYear == null)
            {
                //Trace.WriteLine($"  unknow header value \"{line}\" line {_lineNumber} file \"{_filename}\"");
                if (_traceUnknowHeaderValue)
                {
                    label = "unknow header";
                }
            }
            else if (_traceUnknowValue)
            {
                label = "unknow";
            }
            if (label != null)
            {
                Trace.WriteLine($"  {label} value \"{value.TrimedLine}\" line {value.LineNumber} file \"{value.Filename}\"");
            }
        }
Beispiel #3
0
        public IEnumerable <QuestionResponse_v2> Read(IEnumerable <string> files, string baseDirectory = null)
        {
            _lastValueType        = null;
            _dontSetLastValueType = false;
            _emptyLineCount       = 0;

            _questionYear        = null;
            _questionType        = QuestionType.None;
            _question            = null;
            _questionTmp         = null;
            _associationQuestion = null;
            _sendCurrentQuestion = false;

            _responseYears         = null;
            _responseQuestions     = null;
            _responseCategory      = null;
            _responseQuestionBlock = false;
            _responseQuestion      = null;
            _responseEnd           = false;

            _baseDirectory = baseDirectory;
            TextDataReader textDataReader = new TextDataReader();

            textDataReader.SetRegexList(_questionRegexValuesList);
            bool readResponse = false;
            //int emptyLineCount = 0;
            int pageNumber = 1;

            foreach (QuestionData value in textDataReader.Read(files).Select(textData => QuestionData.CreateQuestionData(textData)))
            {
                if (value.Type != QuestionDataType.EmptyLine)
                {
                    _emptyLineCount = 0;
                }
                else
                {
                    _emptyLineCount++;
                }
                _sendCurrentQuestion  = false;
                _dontSetLastValueType = false;
                switch (value.Type)
                {
                case QuestionDataType.Responses:
                    if (pageNumber >= _minPageForResponses)
                    {
                        if (_trace)
                        {
                            Trace.WriteLine($"start read response (line {value.LineNumber} \"{value.Filename}\")");
                        }
                        textDataReader.SetRegexList(_responseRegexValuesList);
                        textDataReader.ContiguousSearch = true;
                        _sendCurrentQuestion            = true;
                        readResponse           = true;
                        _responseYears         = new List <ResponseReader.ResponseYear>();
                        _responseQuestions     = new List <ResponseReader.ResponseQuestion>();
                        _responseQuestionBlock = false;
                    }
                    break;

                case QuestionDataType.PageNumber:
                    pageNumber++;
                    _sendCurrentQuestion = true;
                    break;

                default:
                    //throw new PBFileException($"unknow value type {value.Type} line {value.LineNumber} file \"{value.Filename}\"", value.File, value.LineNumber);
                    if (!readResponse)
                    {
                        ReadQuestion(value);
                    }
                    else
                    {
                        QuestionResponse_v2 response = ReadResponse(value);
                        if (response != null)
                        {
                            yield return(response);
                        }
                    }
                    break;
                }
                if (_sendCurrentQuestion)
                {
                    if (_question != null)
                    {
                        yield return(GetQuestion());
                    }
                    _question    = _questionTmp;
                    _questionTmp = null;
                }
                //if (readResponse)
                //    break;
                if (!_dontSetLastValueType)
                {
                    _lastValueType = value.Type;
                }
                if (_responseEnd)
                {
                    break;
                }
            }
            if (_question != null)
            {
                yield return(GetQuestion());
            }
            ControlRemindResponseQuestions();
        }
Beispiel #4
0
        private QuestionResponse_v2 ReadResponse(QuestionData value)
        {
            Response_v2 response = null;

            if (_responseQuestion != null && value.Type != QuestionDataType.Response)
            {
                if (_trace)
                {
                    //Trace.WriteLine($"save response question (line {value.LineNumber} \"{value.Filename}\")");
                    Trace.WriteLine($"save response question : {_responseQuestion.Year} - {_responseQuestion.QuestionNumber}");
                }
                SaveResponseQuestion(_responseQuestion);
                _responseQuestion = null;
            }
            switch (value.Type)
            {
            case QuestionDataType.EmptyLine:
                if (_emptyLineCount == _responseMaxEmptyLine && _responseYears.Count > 0)
                {
                    _responseEnd = true;
                }
                break;

            case QuestionDataType.ResponseCategory:
                _responseCategory = ((QuestionDataResponseCategory)value).Category;
                if (_trace)
                {
                    Trace.WriteLine($"response category : {_responseCategory} (line {value.LineNumber} \"{value.Filename}\")");
                }
                ControlRemindResponseQuestions();
                _responseYears         = new List <ResponseReader.ResponseYear>();
                _responseQuestionBlock = false;
                break;

            case QuestionDataType.ResponseYear:
                QuestionDataResponseYear responseYear = (QuestionDataResponseYear)value;
                if (_responseQuestionBlock)
                {
                    throw new PBException($"wrong response year position, line {responseYear.LineNumber} column {responseYear.ColumnIndex + 1} file \"{responseYear.Filename}\"");
                }
                if (_trace)
                {
                    Trace.WriteLine($"response year : {responseYear.Year} (line {value.LineNumber} \"{value.Filename}\")");
                }
                ResponseAddYear(responseYear);
                break;

            case QuestionDataType.QuestionNumber:
                //responseQuestion = NewQuestion(namedValue.Value.Value, namedValue.Value.Index, namedValue.Value.Length, responseQuestion);
                QuestionDataQuestionNumber questionNumber = (QuestionDataQuestionNumber)value;
                if (_trace)
                {
                    Trace.WriteLine($"response question : {questionNumber.QuestionNumber} (line {value.LineNumber} \"{value.Filename}\")");
                }
                _responseQuestion      = ResponseCreateResponseQuestion(questionNumber);
                _responseQuestionBlock = true;
                break;

            case QuestionDataType.Response:
                QuestionDataResponse responseValue = (QuestionDataResponse)value;
                if (_responseQuestion != null && _responseQuestion.SourceLineNumber != responseValue.LineNumber)
                {
                    SaveResponseQuestion(_responseQuestion);
                    _responseQuestion = null;
                }
                response = SetResponse(responseValue, _responseQuestion);
                if (_trace)
                {
                    Trace.WriteLine($"response : {response.Responses} question {response.Year} - {response.QuestionNumber} (line {value.LineNumber} \"{value.Filename}\")");
                }
                _responseQuestion = null;
                break;
            }
            ControlResponseQuestions();
            return(response);
        }
Beispiel #5
0
        private void ReadQuestion(QuestionData value)
        {
            //bool lastValueType = false;
            //bool sendCurrentQuestion = false;
            //QuestionReader.QuestionTmp question = null;
            switch (value.Type)
            {
            case QuestionDataType.EmptyLine:
                if (_lastValueType == QuestionDataType.QuestionChoice ||
                    (_associationQuestion != null && _associationQuestion.Complete && _lastValueType == QuestionDataType.QuestionText))
                {
                    if (_question != null)
                    {
                        _sendCurrentQuestion = true;
                    }
                    else if (_associationQuestion != null)
                    {
                        _associationQuestion.Complete = true;
                    }
                }
                else
                {
                    // dont change _lastValueType
                    _dontSetLastValueType = true;
                }
                break;

            case QuestionDataType.QuestionYear:
                _sendCurrentQuestion = true;
                _questionYear        = ((QuestionDataQuestionYear)value).Year;
                _associationQuestion = null;
                break;

            case QuestionDataType.QuestionType:
                _sendCurrentQuestion = true;
                _questionType        = ((QuestionDataQuestionType)value).QuestionType;
                _associationQuestion = null;
                break;

            case QuestionDataType.QuestionNumber:
                _sendCurrentQuestion = true;
                if (_questionYear == null)
                {
                    throw new PBFileException($"unknow year, line {value.LineNumber} file \"{value.Filename}\"", value.File, value.LineNumber);
                }
                //string sourceFile = GetSubPath(value.File);
                _questionTmp = new QuestionReader.QuestionTmp {
                    Year = (int)_questionYear, Type = _questionType, Number = ((QuestionDataQuestionNumber)value).QuestionNumber,
                    QuestionLineCount = 0, SourceFile = GetSubPath(value.File), SourceLine = value.LineNumber
                };
                if (_associationQuestion != null)
                {
                    _associationQuestion.Complete = true;
                }
                break;

            case QuestionDataType.QuestionChoice:
                QuestionAddChoice((QuestionDataQuestionChoice)value);
                break;

            case QuestionDataType.Unknow:
                switch (_lastValueType)
                {
                case QuestionDataType.QuestionNumber:
                    _question.QuestionText = value.TrimedLine;
                    _question.QuestionLineCount++;
                    _lastValueType        = QuestionDataType.QuestionText;
                    _dontSetLastValueType = true;
                    break;

                case QuestionDataType.QuestionText:
                    QuestionAddLine(value);
                    // keep _lastValueType to QuestionDataType.QuestionText
                    _dontSetLastValueType = true;
                    break;

                case QuestionDataType.QuestionChoice:
                    QuestionAddChoiceLine(value);
                    // keep _lastValueType to QuestionDataType.QuestionChoice
                    _dontSetLastValueType = true;
                    break;

                default:
                    // _manageAssociationQuestion
                    if (_lastValueType == QuestionDataType.QuestionType && _questionType == QuestionType.Association)
                    {
                        _associationQuestion = new QuestionReader.QuestionAssociationTmp {
                            Type = QuestionType.Association, QuestionText = value.TrimedLine, QuestionLineCount = 1, Complete = false
                        };
                        _lastValueType        = QuestionDataType.QuestionText;
                        _dontSetLastValueType = true;
                    }
                    else
                    {
                        _TraceUnknowValue(value);
                    }
                    break;
                }
                break;
            }
        }