コード例 #1
0
        internal override ExtractedInfo ExtractFieldString(LineInfo line)
        {
            if (line.CurrentLength == 0)
            {
                if (mIsOptional)
                    return ExtractedInfo.Empty;
                else
                    throw new BadUsageException("End Of Line found processing the field: " + mFieldInfo.Name + " at line "+ line.mReader.LineNumber.ToString() + ". (You need to mark it as [FieldOptional] if you want to avoid this exception)");
            }

            ExtractedInfo res;

            if (line.CurrentLength < this.mFieldLength)
                if (mFixedMode == FixedMode.AllowLessChars ||
                    mFixedMode == FixedMode.AllowVariableLength)
                    res = new ExtractedInfo(line);
                else
                    throw new BadUsageException("The string '" + line.CurrentString + "' (length " + line.CurrentLength.ToString() + ") at line "+ line.mReader.LineNumber.ToString() + " has less chars than the defined for " + mFieldInfo.Name + " (" + mFieldLength.ToString() + "). You can use the [FixedLengthRecord(FixedMode.AllowLessChars)] to avoid this problem.");
            else if (line.CurrentLength > mFieldLength  &&
                        mIsArray == false &&
                        mIsLast &&
                        mFixedMode != FixedMode.AllowMoreChars &&
                        mFixedMode != FixedMode.AllowVariableLength)
                throw new BadUsageException("The string '" + line.CurrentString + "' (length " + line.CurrentLength.ToString() + ") at line "+ line.mReader.LineNumber.ToString() + " has more chars than the defined for the last field " + mFieldInfo.Name + " (" + mFieldLength.ToString() + ").You can use the [FixedLengthRecord(FixedMode.AllowMoreChars)] to avoid this problem.");
            else
                res = new ExtractedInfo(line, line.mCurrentPos + mFieldLength);

            return res;
        }
コード例 #2
0
ファイル: FieldBase.cs プロジェクト: pjeconde/CedFCIC
// object[] values, int index, ForwardReader reader
        internal object ExtractValue(LineInfo line)
        {
            //-> extract only what I need

            if (this.mInNewLine == true)
            {
                if (line.EmptyFromPos() == false)
                {
                    throw new BadUsageException("Text '" + line.CurrentString +
                                                "' found before the new line of the field: " + mFieldInfo.Name +
                                                " (this is not allowed when you use [FieldInNewLine])");
                }

                line.ReLoad(line.mReader.ReadNextLine());

                if (line.mLineStr == null)
                {
                    throw new BadUsageException("End of stream found parsing the field " + mFieldInfo.Name +
                                                ". Please check the class record.");
                }
            }

            ExtractedInfo info = ExtractFieldString(line);

            if (info.mCustomExtractedString == null)
            {
                line.mCurrentPos = info.ExtractedTo + 1;
            }

            line.mCurrentPos += mCharsToDiscard;             //total;

            return(AssignFromString(info, line));


            //-> discard the part that I use


            //TODO: Uncoment this for Quoted Handling
//			if (info.NewRestOfLine != null)
//			{
//				if (info.NewRestOfLine.Length < CharsToDiscard())
//					return info.NewRestOfLine;
//				else
//					return info.NewRestOfLine.Substring(CharsToDiscard());
//			}
//			else
//			{
//				int total;
//				if (info.CharsRemoved >= line.mLine.Length)
//					total = line.mLine.Length;
//				else
//					total = info.CharsRemoved + CharsToDiscard();

            //return buffer.Substring(total);
//			}
        }
コード例 #3
0
ファイル: FieldBase.cs プロジェクト: cuongdodinh/timok.rbr
//		public ConverterBase ConvertProvider
//		{
//			get { return mConvertProvider; }
//			set { mConvertProvider = value; }
//		}
//
//		#endregion



//		#region "  TrimMode  "
//
//		public TrimMode TrimMode
//		{
//			get { return mTrimMode; }
//		}
//
//		#endregion
//
//		#region "  TrimChars  "
//
//		public char[] TrimChars
//		{
//			get { return mTrimChars; }
//		}
//
//		#endregion
//
//		#region "  IsOptional  "
//
//		public bool IsOptional
//		{
//			get { return mIsOptional; }
//		}
//
//		#endregion
//
//		#region "  NextIsOptional  "
//
//		internal bool NextIsOptional
//		{
//			get { return mNextIsOptional; }
//			set { mNextIsOptional = value; }
//		}
//
//		#endregion

//		#region "  InNewLine  "

//		public bool InNewLine
//		{
//			get { return mInNewLine; }
//		}
//
//		#endregion
//
//

//		#region "  FieldType  "
//
//		public Type FieldType
//		{
//			get { return mFieldType; }
//		}
//
//		#endregion

        #region "  ExtractAndAssignFromString  "

        internal string ExtractAndAssignFromString(string buffer, object record, ForwardReader reader)
        {
            //-> extract only what I need

            if (this.mInNewLine == true)
            {
                if (buffer.Trim() != String.Empty)
                {
                    throw new BadUsageException("Text '" + buffer + "' found before the new line of the field: " + mFieldInfo.Name + " (this is not allowed when you use [FieldInNewLine])");
                }

                buffer = reader.ReadNextLine();

                if (buffer == null)
                {
                    throw new BadUsageException("End of stream found parsing the field " + mFieldInfo.Name + ". Please check the class record.");
                }
            }

            ExtractedInfo info = ExtractFieldString(buffer, reader);

            AssignFromString(info.ExtractedString, record);

            //-> discard the part that I use


            if (info.NewRestOfLine != null)
            {
                if (info.NewRestOfLine.Length < CharsToDiscard())
                {
                    return(info.NewRestOfLine);
                }
                else
                {
                    return(info.NewRestOfLine.Substring(CharsToDiscard()));
                }
            }
            else
            {
                int total;
                if (info.CharsRemoved >= buffer.Length)
                {
                    total = buffer.Length;
                }
                else
                {
                    total = info.CharsRemoved + CharsToDiscard();
                }

                return(buffer.Substring(total));
            }
        }
コード例 #4
0
        internal override ExtractedInfo ExtractFieldString(LineInfo line)
        {
            if (line.CurrentLength == 0)
            {
                if (mIsOptional)
                {
                    return(ExtractedInfo.Empty);
                }
                else
                {
                    throw new BadUsageException("End Of Line found processing the field: " + mFieldInfo.Name + " at line " + line.mReader.LineNumber.ToString() + ". (You need to mark it as [FieldOptional] if you want to avoid this exception)");
                }
            }

            ExtractedInfo res;

            if (line.CurrentLength < this.mFieldLength)
            {
                if (mFixedMode == FixedMode.AllowLessChars ||
                    mFixedMode == FixedMode.AllowVariableLength)
                {
                    res = new ExtractedInfo(line);
                }
                else
                {
                    throw new BadUsageException("The string '" + line.CurrentString + "' (length " + line.CurrentLength.ToString() + ") at line " + line.mReader.LineNumber.ToString() + " has less chars than the defined for " + mFieldInfo.Name + " (" + mFieldLength.ToString() + "). You can use the [FixedLengthRecord(FixedMode.AllowLessChars)] to avoid this problem.");
                }
            }
            else if (line.CurrentLength > mFieldLength &&
                     mIsArray == false &&
                     mIsLast &&
                     mFixedMode != FixedMode.AllowMoreChars &&
                     mFixedMode != FixedMode.AllowVariableLength)
            {
                throw new BadUsageException("The string '" + line.CurrentString + "' (length " + line.CurrentLength.ToString() + ") at line " + line.mReader.LineNumber.ToString() + " has more chars than the defined for the last field " + mFieldInfo.Name + " (" + mFieldLength.ToString() + ").You can use the [FixedLengthRecord(FixedMode.AllowMoreChars)] to avoid this problem.");
            }
            else
            {
                res = new ExtractedInfo(line, line.mCurrentPos + mFieldLength);
            }

            return(res);
        }
コード例 #5
0
        protected override ExtractedInfo ExtractFieldString(string from, ForwardReader reader)
        {
            if (mIsOptional && from.Length == 0)
            {
                return(ExtractedInfo.Empty);
            }

            ExtractedInfo res;

            if (from.Length < this.mLength)
            {
                throw new FileHelperException("The string '" + from + "' (length " + from.Length.ToString() + ") don´t match the length of the field " + mFieldInfo.Name + " (" + mLength.ToString() + ")");
            }
            else
            {
                res = new ExtractedInfo(from.Substring(0, this.mLength));
            }

            return(res);
        }
コード例 #6
0
ファイル: DelimitedField.cs プロジェクト: pjeconde/CedFCIC
        private ExtractedInfo BasicExtractString(LineInfo line)
        {
            ExtractedInfo res;

            if (mIsLast)
            {
                res = new ExtractedInfo(line);
            }
            else
            {
                int sepPos;

                sepPos = line.IndexOf(mSeparator);

                if (sepPos == -1)
                {
                    if (this.mNextIsOptional == false)
                    {
                        string msg = null;

                        if (mIsFirst && line.EmptyFromPos())
                        {
                            msg = "The line " + line.mReader.LineNumber.ToString() + " is empty. Maybe you need to use the attribute [IgnoreEmptyLines] in your record class.";
                        }
                        else
                        {
                            msg = "The delimiter '" + this.mSeparator + "' can´t be found after the field '" + this.mFieldInfo.Name + "' at line " + line.mReader.LineNumber.ToString() + " (the record has less fields, the delimiter is wrong or the next field must be marked as optional).";
                        }

                        throw new FileHelpersException(msg);
                    }
                    else
                    {
                        sepPos = line.mLine.Length - 1;
                    }
                }

                res = new ExtractedInfo(line, sepPos);
            }
            return(res);
        }
コード例 #7
0
ファイル: FieldBase.cs プロジェクト: rmegal/FileHelpers
        /// <summary>
        /// Create field object after extracting the string from the underlying
        /// input data
        /// </summary>
        /// <param name="fieldString">Information extracted?</param>
        /// <param name="line">Underlying input data</param>
        /// <returns>Object to assign to field</returns>
        private AssignResult AssignFromString(ExtractedInfo fieldString, LineInfo line)
        {
            object val;

            var extractedString = fieldString.ExtractedString();

            try {
                if (IsNotEmpty && String.IsNullOrEmpty(extractedString)) {
                    throw new InvalidOperationException("The value is empty and must be populated.");
                } else if (this.Converter == null) {
                    if (IsStringField)
                        val = TrimString(extractedString);
                    else {
                        extractedString = extractedString.Trim();

                        if (extractedString.Length == 0) {
                            return new AssignResult {
                                Value = GetNullValue(line),
                                NullValueUsed = true
                            };
                        }
                        else
                            val = Convert.ChangeType(extractedString, FieldTypeInternal, null);
                    }
                }
                else {
                    var trimmedString = extractedString.Trim();

                    if (this.Converter.CustomNullHandling == false &&
                        trimmedString.Length == 0) {
                        return new AssignResult {
                            Value = GetNullValue(line),
                            NullValueUsed = true
                        };
                    }
                    else {
                        if (TrimMode == TrimMode.Both)
                            val = this.Converter.StringToField(trimmedString);
                        else
                            val = this.Converter.StringToField(TrimString(extractedString));

                        if (val == null) {
                            return new AssignResult {
                                Value = GetNullValue(line),
                                NullValueUsed = true
                            };
                        }
                    }
                }

                return new AssignResult {
                    Value = val
                };
            }
            catch (ConvertException ex) {
                ex.FieldName = FieldInfo.Name;
                ex.LineNumber = line.mReader.LineNumber;
                ex.ColumnNumber = fieldString.ExtractedFrom + 1;
                throw;
            }
            catch (BadUsageException) {
                throw;
            }
            catch (Exception ex) {
                if (this.Converter == null ||
                    this.Converter.GetType().Assembly == typeof (FieldBase).Assembly) {
                    throw new ConvertException(extractedString,
                        FieldTypeInternal,
                        FieldInfo.Name,
                        line.mReader.LineNumber,
                        fieldString.ExtractedFrom + 1,
                        ex.Message,
                        ex);
                }
                else {
                    throw new ConvertException(extractedString,
                        FieldTypeInternal,
                        FieldInfo.Name,
                        line.mReader.LineNumber,
                        fieldString.ExtractedFrom + 1,
                        "Your custom converter: " + this.Converter.GetType().Name + " throws an " + ex.GetType().Name +
                        " with the message: " + ex.Message,
                        ex);
                }
            }
        }
コード例 #8
0
ファイル: FieldBase.cs プロジェクト: keif888/TextFileSplitter
        /// <summary>
        /// Get the data out of the records
        /// </summary>
        /// <param name="line">Line handler containing text</param>
        /// <returns></returns>
        internal object ExtractFieldValue(LineInfo line)
        {
            //-> extract only what I need

            if (InNewLine)
            {
                // Any trailing characters, terminate
                if (line.EmptyFromPos() == false)
                {
                    throw new BadUsageException(line, "Text '" + line.CurrentString +
                                                "' found before the new line of the field: " + FieldInfo.Name +
                                                " (this is not allowed when you use [FieldInNewLine])");
                }

                line.ReLoad(line.mReader.ReadNextLine());

                if (line.mLineStr == null)
                {
                    throw new BadUsageException(line, "End of stream found parsing the field " + FieldInfo.Name +
                                                ". Please check the class record.");
                }
            }

            if (IsArray == false)
            {
                ExtractedInfo info = ExtractFieldString(line);
                if (info.mCustomExtractedString == null)
                {
                    line.mCurrentPos = info.ExtractedTo + 1;
                }

                line.mCurrentPos += CharsToDiscard; //total;

                if (Discarded)
                {
                    return(GetDiscardedNullValue());
                }
                else
                {
                    return(AssignFromString(info, line).Value);
                }
            }
            else
            {
                if (ArrayMinLength <= 0)
                {
                    ArrayMinLength = 0;
                }

                int i = 0;

                var res = new ArrayList(Math.Max(ArrayMinLength, 10));

                while (line.mCurrentPos - CharsToDiscard < line.mLineStr.Length && i < ArrayMaxLength)
                {
                    ExtractedInfo info = ExtractFieldString(line);
                    if (info.mCustomExtractedString == null)
                    {
                        line.mCurrentPos = info.ExtractedTo + 1;
                    }

                    line.mCurrentPos += CharsToDiscard;

                    try
                    {
                        var value = AssignFromString(info, line);

                        if (value.NullValueUsed && i == 0 && line.IsEOL())
                        {
                            break;
                        }

                        res.Add(value.Value);
                    }
                    catch (NullValueNotFoundException)
                    {
                        if (i == 0)
                        {
                            break;
                        }
                        else
                        {
                            throw;
                        }
                    }
                    i++;
                }

                if (res.Count < ArrayMinLength)
                {
                    throw new InvalidOperationException(string.Format("Line: {0} Column: {1} Field: {2}. The array has only {3} values, less than the minimum length of {4}", line.mReader.LineNumber.ToString(), line.mCurrentPos.ToString(), FieldInfo.Name, res.Count, ArrayMinLength));
                }
                else if (IsLast && line.IsEOL() == false)
                {
                    throw new InvalidOperationException(string.Format("Line: {0} Column: {1} Field: {2}. The array has more values than the maximum length of {3}", line.mReader.LineNumber, line.mCurrentPos, FieldInfo.Name, ArrayMaxLength));
                }

                // TODO:   is there a reason we go through all the array processing then discard it
                if (Discarded)
                {
                    return(null);
                }
                else
                {
                    return(res.ToArray(ArrayType));
                }
            }
        }
コード例 #9
0
ファイル: FieldBase.cs プロジェクト: keif888/TextFileSplitter
        /// <summary>
        /// Create field object after extracting the string from the underlying
        /// input data
        /// </summary>
        /// <param name="fieldString">Information extracted?</param>
        /// <param name="line">Underlying input data</param>
        /// <returns>Object to assign to field</returns>
        private AssignResult AssignFromString(ExtractedInfo fieldString, LineInfo line)
        {
            object val;

            var extractedString = fieldString.ExtractedString();

            try
            {
                if (this.Converter == null)
                {
                    if (IsStringField)
                    {
                        val = TrimString(extractedString);
                    }
                    else
                    {
                        extractedString = extractedString.Trim();

                        if (extractedString.Length == 0)
                        {
                            return(new AssignResult {
                                Value = GetNullValue(line), NullValueUsed = true
                            });
                        }
                        else
                        {
                            val = Convert.ChangeType(extractedString, FieldTypeInternal, null);
                        }
                    }
                }
                else
                {
                    var trimmedString = extractedString.Trim();

                    if (this.Converter.CustomNullHandling == false &&
                        trimmedString.Length == 0)
                    {
                        return(new AssignResult {
                            Value = GetNullValue(line), NullValueUsed = true
                        });
                    }
                    else
                    {
                        if (TrimMode == TrimMode.Both)
                        {
                            val = this.Converter.StringToField(trimmedString);
                        }
                        else
                        {
                            val = this.Converter.StringToField(TrimString(extractedString));
                        }

                        if (val == null)
                        {
                            return new AssignResult {
                                       Value = GetNullValue(line), NullValueUsed = true
                            }
                        }
                        ;
                    }
                }

                return(new AssignResult {
                    Value = val
                });
            }
            catch (ConvertException ex)
            {
                if (this.NullFieldOnError)
                {
                    return(new AssignResult {
                        Value = GetNullValue(line), NullValueUsed = true
                    });
                }
                else
                {
                    ex.FieldName    = FieldInfo.Name;
                    ex.LineNumber   = line.mReader.LineNumber;
                    ex.ColumnNumber = fieldString.ExtractedFrom + 1;
                    throw;
                }
            }
            catch (BadUsageException)
            {
                throw;
            }
            catch (Exception ex)
            {
                if (this.Converter == null || this.Converter.GetType().Assembly == typeof(FieldBase).Assembly)
                {
                    throw new ConvertException(extractedString, FieldTypeInternal, FieldInfo.Name, line.mReader.LineNumber, fieldString.ExtractedFrom + 1, ex.Message, ex);
                }
                else
                {
                    throw new ConvertException(extractedString, FieldTypeInternal, FieldInfo.Name, line.mReader.LineNumber, fieldString.ExtractedFrom + 1, "Your custom converter: " + this.Converter.GetType().Name + " throws an " + ex.GetType().Name + " with the message: " + ex.Message, ex);
                }
            }
        }
コード例 #10
0
        internal object AssignFromString(ExtractedInfo fieldString, LineInfo line)
        {
            object val;

            switch (mTrimMode)
            {
            case TrimMode.None:
                break;

            case TrimMode.Both:
                fieldString.TrimBoth(mTrimChars);
                break;

            case TrimMode.Left:
                fieldString.TrimStart(mTrimChars);
                break;

            case TrimMode.Right:
                fieldString.TrimEnd(mTrimChars);
                break;
            }

            try
            {
                if (mConvertProvider == null)
                {
                    if (mIsStringField)
                    {
                        val = fieldString.ExtractedString();
                    }
                    else
                    {
                        // Trim it to use Convert.ChangeType
                        fieldString.TrimBoth(WhitespaceChars);

                        if (fieldString.Length == 0)
                        {
                            // Empty stand for null
                            val = GetNullValue(line);
                        }
                        else
                        {
                            val = Convert.ChangeType(fieldString.ExtractedString(), mFieldTypeInternal, null);
                        }
                    }
                }
                else
                {
                    if (mConvertProvider.CustomNullHandling == false &&
                        fieldString.HasOnlyThisChars(WhitespaceChars))
                    {
                        val = GetNullValue(line);
                    }
                    else
                    {
                        string from = fieldString.ExtractedString();
                        val = mConvertProvider.StringToField(from);

                        if (val == null)
                        {
                            val = GetNullValue(line);
                        }
                    }
                }

                return(val);
            }
            catch (ConvertException ex)
            {
                throw ConvertException.ReThrowException(ex, mFieldInfo.Name, line.mReader.LineNumber, fieldString.ExtractedFrom + 1);
            }
            catch (BadUsageException)
            {
                throw;
            }
            catch (Exception ex)
            {
                if (mConvertProvider == null || mConvertProvider.GetType().Assembly == typeof(FieldBase).Assembly)
                {
                    throw new ConvertException(fieldString.ExtractedString(), mFieldTypeInternal, mFieldInfo.Name, line.mReader.LineNumber, fieldString.ExtractedFrom + 1, ex.Message, ex);
                }
                else
                {
                    throw new ConvertException(fieldString.ExtractedString(), mFieldTypeInternal, mFieldInfo.Name, line.mReader.LineNumber, fieldString.ExtractedFrom + 1, "Your custom converter: " + mConvertProvider.GetType().Name + " throws an " + ex.GetType().Name + " with the message: " + ex.Message, ex);
                }
            }
        }
コード例 #11
0
        internal object ExtractFieldValue(LineInfo line)
        {
            //-> extract only what I need

            if (mInNewLine)
            {
                if (line.EmptyFromPos() == false)
                {
                    throw new BadUsageException(line, "Text '" + line.CurrentString +
                                                "' found before the new line of the field: " + mFieldInfo.Name +
                                                " (this is not allowed when you use [FieldInNewLine])");
                }

                line.ReLoad(line.mReader.ReadNextLine());

                if (line.mLineStr == null)
                {
                    throw new BadUsageException(line, "End of stream found parsing the field " + mFieldInfo.Name +
                                                ". Please check the class record.");
                }
            }

            if (mIsArray == false)
            {
                ExtractedInfo info = ExtractFieldString(line);
                if (info.mCustomExtractedString == null)
                {
                    line.mCurrentPos = info.ExtractedTo + 1;
                }

                line.mCurrentPos += mCharsToDiscard; //total;

                return(AssignFromString(info, line));
            }
            else
            {
                if (mArrayMinLength <= 0)
                {
                    mArrayMinLength = 0;
                }

                int i = 0;

                ArrayList res = new ArrayList(Math.Max(mArrayMinLength, 10));

                while (line.mCurrentPos - mCharsToDiscard < line.mLine.Length && i < mArrayMaxLength)
                {
                    ExtractedInfo info = ExtractFieldString(line);
                    if (info.mCustomExtractedString == null)
                    {
                        line.mCurrentPos = info.ExtractedTo + 1;
                    }

                    line.mCurrentPos += mCharsToDiscard;

                    res.Add(AssignFromString(info, line));
                    i++;
                }

                if (res.Count < mArrayMinLength)
                {
                    throw new InvalidOperationException(string.Format("Line: {0} Column: {1} Field: {2}. The array has only {3} values, less than the minimum length of {4}", line.mReader.LineNumber.ToString(), line.mCurrentPos.ToString(), mFieldInfo.Name, res.Count, mArrayMinLength));
                }

                else if (mIsLast && line.IsEOL() == false)
                {
                    throw new InvalidOperationException(string.Format("Line: {0} Column: {1} Field: {2}. The array has more values than the maximum length of {3}", line.mReader.LineNumber, line.mCurrentPos, mFieldInfo.Name, mArrayMaxLength));
                }

                return(res.ToArray(mArrayType));
            }
        }
コード例 #12
0
        protected override ExtractedInfo ExtractFieldString(string from, ForwardReader reader)
        {
            if (mIsOptional && from.Length == 0)
            {
                return(ExtractedInfo.Empty);
            }

            ExtractedInfo res;

            if (mQuoteChar == '\0')
            {
                if (mIsLast)
                {
                    res = new ExtractedInfo(from);
                }
                else
                {
                    int sepPos = from.IndexOf(this.mSeparator);

                    if (sepPos == -1)
                    {
                        if (this.mNextIsOptional == false)
                        {
                            throw new FileHelperException("The separator '" + this.mSeparator + "' can´t be found after the field '" + this.mFieldInfo.Name + "' (the record has less fields, the separator is wrong or the next field must be marked as optional).");
                        }
                        else
                        {
                            sepPos = from.Length;
                        }
                    }

                    res = new ExtractedInfo(from.Substring(0, sepPos));
                }
            }
            else
            {
                string quotedStr = mQuoteChar.ToString();
                res = new ExtractedInfo();
                res.CharsRemoved = 0;

                string from2 = from;
                if (mTrimMode == TrimMode.Both || mTrimMode == TrimMode.Left)
                {
                    from2            = from.TrimStart(mTrimChars);
                    res.CharsRemoved = from2.Length - from.Length;
                }

                if (from2.StartsWith(quotedStr))
                {
                    if (mQuoteMultiline == MultilineMode.AllowForBoth || mQuoteMultiline == MultilineMode.AllowForRead)
                    {
                        ExtractedInfo ei = StringHelper.ExtractQuotedString(from2, reader, mQuoteChar);
                        res.ExtractedString = ei.ExtractedString;
                        res.CharsRemoved   += ei.CharsRemoved;
                        res.ExtraLines      = ei.ExtraLines;
                        res.NewRestOfLine   = ei.NewRestOfLine;
                    }
                    else
                    {
                        int index = 0;

                        res.ExtractedString = StringHelper.ExtractQuotedString(from2, mQuoteChar, out index);
                        res.CharsRemoved   += index;
                    }
                }
                else
                {
                    if (mQuoteMode == QuoteMode.OptionalForBoth || mQuoteMode == QuoteMode.OptionalForRead)
                    {
                        if (mIsLast)
                        {
                            res = new ExtractedInfo(from);
                        }
                        else
                        {
                            int sepPos = from.IndexOf(this.mSeparator);

                            if (sepPos == -1)
                            {
                                if (this.mNextIsOptional == false)
                                {
                                    throw new FileHelperException("The separator '" + this.mSeparator + "' can´t be found after the field '" + this.mFieldInfo.Name + "' (the record has less fields, the separator is wrong or the next field must be marked as optional).");
                                }
                                else
                                {
                                    sepPos = from.Length;
                                }
                            }

                            res = new ExtractedInfo(from.Substring(0, sepPos));
                        }
                    }
                    else if (from.Trim().StartsWith(quotedStr))
                    {
                        throw new BadUsageException("The field '" + this.mFieldInfo.Name + "' has spaces before the QuotedChar in the data use the TrimAttribute to by pass this error. Field String: " + from);
                    }
                    else
                    {
                        throw new BadUsageException("The field '" + this.mFieldInfo.Name + "' not begin with the QuotedChar in the data. You can use FieldQuoted(QuoteMode.OptionalForRead) to allow optional quoted field.. Field String: " + from);
                    }
                }
            }


            return(res);
        }
コード例 #13
0
ファイル: StringHelper.cs プロジェクト: cuongdodinh/timok.rbr
        internal static ExtractedInfo ExtractQuotedString(string source, ForwardReader reader, char quoteChar)
        {
            StringBuilder res   = new StringBuilder(32);
            int           lines = 0;

            bool beginEscape = false;

            if (reader == null)
            {
                throw new BadUsageException("The reader can´t be null");
            }

            if (source == null || source.Length == 0)
            {
                throw new BadUsageException("An empty String found and can be parsed like a QuotedString try to use SafeExtractQuotedString");
            }


            if (source[0] != quoteChar)
            {
                throw new BadUsageException("The source string not begins with the quote char: " + quoteChar);
            }

            int  i            = 1;
            bool mustContinue = true;

            while (mustContinue && source != null)
            {
                while (i < source.Length)
                {
                    if (source[i] == quoteChar)
                    {
                        if (beginEscape == true)
                        {
                            beginEscape = false;
                            res.Append(quoteChar);
                        }
                        else
                        {
                            beginEscape = true;
                        }
                    }
                    else
                    {
                        if (beginEscape)
                        {
                            // End of the String
                            ExtractedInfo ei = new ExtractedInfo(res.ToString(), i, lines);
                            if (lines != 0)
                            {
                                ei.NewRestOfLine = source.Substring(i);
                            }
                            return(ei);
                        }
                        else
                        {
                            res.Append(source[i]);
                        }
                    }
                    i++;
                }


                if (beginEscape)
                {
                    return(new ExtractedInfo(res.ToString(), i + 1, lines));
                }
                else
                {
                    source = reader.ReadNextLine();
                    res.Append(StringHelper.NewLine);
                    lines++;
                    i = 0;
                }
            }

            throw new BadUsageException("The current field has an UnClosed quoted string. Complete Filed String: " + res.ToString());
        }
コード例 #14
0
ファイル: FieldBase.cs プロジェクト: pjeconde/CedFCIC
        internal object AssignFromString(ExtractedInfo fieldString, LineInfo line)
        {
            object val;

            switch (mTrimMode)
            {
            case TrimMode.None:
                break;

            case TrimMode.Both:
                fieldString.TrimBoth(mTrimChars);
                break;

            case TrimMode.Left:
                fieldString.TrimStart(mTrimChars);
                break;

            case TrimMode.Right:
                fieldString.TrimEnd(mTrimChars);
                break;
            }

            try
            {
                if (mConvertProvider == null)
                {
                    if (mIsStringField)
                    {
                        val = fieldString.ExtractedString();
                    }
                    else
                    {
                        // Trim it to use Convert.ChangeType
                        fieldString.TrimBoth(WhitespaceChars);

                        if (fieldString.Length == 0)
                        {
                            // Empty stand for null
                            val = GetNullValue();
                        }
                        else
                        {
                            val = Convert.ChangeType(fieldString.ExtractedString(), mFieldType, null);
                        }
                    }
                }

                else
                {
                    if (mConvertProvider.CustomNullHandling == false &&
                        fieldString.HasOnlyThisChars(WhitespaceChars))
                    {
                        val = GetNullValue();
                    }
                    else
                    {
                        string from = fieldString.ExtractedString();
                        val = mConvertProvider.StringToField(from);

                        if (val == null)
                        {
                            val = GetNullValue();
                        }
                    }
                }

                return(val);
            }
            catch (ConvertException ex)
            {
                throw ConvertException.ReThrowException(ex, mFieldInfo.Name, line.mReader.LineNumber, fieldString.ExtractedFrom + 1);
            }
        }
コード例 #15
0
ファイル: FieldBase.cs プロジェクト: hoffmanc/FileHelpers
        internal object AssignFromString(ExtractedInfo fieldString, LineInfo line)
        {
            object val;

            switch (mTrimMode)
            {
                case TrimMode.None:
                    break;

                case TrimMode.Both:
                    fieldString.TrimBoth(mTrimChars);
                    break;

                case TrimMode.Left:
                    fieldString.TrimStart(mTrimChars);
                    break;

                case TrimMode.Right:
                    fieldString.TrimEnd(mTrimChars);
                    break;
            }

            try
            {

                if (mConvertProvider == null)
                {
                    if (mIsStringField)
                        val = fieldString.ExtractedString();
                    else
                    {
                        // Trim it to use Convert.ChangeType
                        fieldString.TrimBoth(WhitespaceChars);

                        if (fieldString.Length == 0)
                        {
                            // Empty stand for null
                            val = GetNullValue(line);
                        }
                        else
                        {
                            val = Convert.ChangeType(fieldString.ExtractedString(), mFieldTypeInternal, null);
                        }
                    }
                }
                else
                {
                    if (mConvertProvider.CustomNullHandling == false &&
                        fieldString.HasOnlyThisChars(WhitespaceChars))
                    {
                        val = GetNullValue(line);
                    }
                    else
                    {
                        string from = fieldString.ExtractedString();
                        val = mConvertProvider.StringToField(from);

                        if (val == null)
                            val = GetNullValue(line);

                    }
                }

                return val;
            }
            catch (ConvertException ex)
            {
                throw ConvertException.ReThrowException(ex, mFieldInfo.Name, line.mReader.LineNumber, fieldString.ExtractedFrom + 1);
            }
            catch (BadUsageException)
            {
                throw;
            }
            catch (Exception ex)
            {
                if (mConvertProvider == null || mConvertProvider.GetType().Assembly == typeof(FieldBase).Assembly)
                    throw new ConvertException(fieldString.ExtractedString(), mFieldTypeInternal, mFieldInfo.Name, line.mReader.LineNumber, fieldString.ExtractedFrom + 1, ex.Message, ex);
                else
                    throw new ConvertException(fieldString.ExtractedString(), mFieldTypeInternal, mFieldInfo.Name, line.mReader.LineNumber, fieldString.ExtractedFrom + 1, "Your custom converter: " + mConvertProvider.GetType().Name + " throws an " + ex.GetType().Name + " with the message: " + ex.Message, ex);
            }
        }
コード例 #16
0
ファイル: FieldBase.cs プロジェクト: jalchr/FileHelpers
        internal object AssignFromString(ExtractedInfo fieldString, LineInfo line)
        {
            object val;

            var extractedString = fieldString.ExtractedString();
            var trimmedBoth = false;
            switch (TrimMode)
            {
                case TrimMode.None:
                    break;

                case TrimMode.Both:
                    extractedString = extractedString.Trim();
                    trimmedBoth = true;
                    //fieldString.TrimBoth(TrimChars);
                    break;

                case TrimMode.Left:
                    extractedString = extractedString.TrimStart();
                    //fieldString.TrimStart(TrimChars);
                    break;

                case TrimMode.Right:
                    extractedString = extractedString.TrimEnd();
                    //fieldString.TrimEnd(TrimChars);
                    break;
            }

            try
            {
                if (ConvertProvider == null)
                {
                    if (IsStringField)
                        val = extractedString;
                    else
                    {
                        // Trim it to use Convert.ChangeType
                        if (trimmedBoth == false)
                            extractedString = extractedString.Trim();

                        if (extractedString.Length == 0)
                        {
                            // Empty stand for null
                            val = GetNullValue(line);
                        }
                        else
                        {
                            val = Convert.ChangeType(extractedString, FieldTypeInternal, null);
                        }
                    }
                }
                else
                {
                    var trimmedString = extractedString;
                    if (trimmedBoth == false)
                    {
                        trimmedString = extractedString.Trim();
                    }

                    if (ConvertProvider.CustomNullHandling == false &&
                        trimmedString.Length == 0)
                    {
                        val = GetNullValue(line);
                    }
                    else
                    {
                        string from = extractedString;
                        val = ConvertProvider.StringToField(from);

                        if (val == null)
                            val = GetNullValue(line);

                    }
                }

                return val;
            }
            catch (ConvertException ex)
            {
                ex.FieldName = FieldInfo.Name;
                ex.LineNumber = line.mReader.LineNumber;
                ex.ColumnNumber = fieldString.ExtractedFrom + 1;
                throw;
            }
            catch (BadUsageException)
            {
                throw;
            }
            catch (Exception ex)
            {
                if (ConvertProvider == null || ConvertProvider.GetType().Assembly == typeof(FieldBase).Assembly)
                    throw new ConvertException(extractedString, FieldTypeInternal, FieldInfo.Name, line.mReader.LineNumber, fieldString.ExtractedFrom + 1, ex.Message, ex);
                else
                    throw new ConvertException(extractedString, FieldTypeInternal, FieldInfo.Name, line.mReader.LineNumber, fieldString.ExtractedFrom + 1, "Your custom converter: " + ConvertProvider.GetType().Name + " throws an " + ex.GetType().Name + " with the message: " + ex.Message, ex);
            }
        }
コード例 #17
0
		private ExtractedInfo BasicExtractString(LineInfo line)
		{
			ExtractedInfo res;
			
			if (mIsLast)
				res = new ExtractedInfo(line);
			else
			{
				int sepPos;

				sepPos = line.IndexOf(mSeparator);

				if (sepPos == -1)
				{
					if (this.mNextIsOptional == false)
					{
						string msg = null;

						if (mIsFirst && line.EmptyFromPos())
							msg = "The line " + line.mReader.LineNumber.ToString() + " is empty. Maybe you need to use the attribute [IgnoreEmptyLines] in your record class.";
						else
							msg = "The delimiter '" + this.mSeparator + "' can´t be found after the field '" + this.mFieldInfo.Name + "' at line " + line.mReader.LineNumber.ToString() + " (the record has less fields, the delimiter is wrong or the next field must be marked as optional).";

						throw new FileHelpersException(msg);

					}
					else
						sepPos = line.mLine.Length - 1;
				}

				res = new ExtractedInfo(line, sepPos);
			}
			return res;
		}
コード例 #18
0
ファイル: FieldBase.cs プロジェクト: pjeconde/CedForecast
        internal object AssignFromString(ExtractedInfo fieldString, LineInfo line)
        {
            object val;

            switch (mTrimMode)
            {
                case TrimMode.None:
                    break;

                case TrimMode.Both:
                    fieldString.TrimBoth(mTrimChars);
                    break;

                case TrimMode.Left:
                    fieldString.TrimStart(mTrimChars);
                    break;

                case TrimMode.Right:
                    fieldString.TrimEnd(mTrimChars);
                    break;
            }
            
            try
            {

                if (mConvertProvider == null)
                {
                    if (mIsStringField)
                        val = fieldString.ExtractedString();
                    else
                    {
                        // Trim it to use Convert.ChangeType
                        fieldString.TrimBoth(WhitespaceChars);

                        if (fieldString.Length == 0)
                        {
                            // Empty stand for null
                            val = GetNullValue();
                        }
                        else
                        {
                            val = Convert.ChangeType(fieldString.ExtractedString(), mFieldType, null);
                        }
                    }
                }

                else
                {
                    if (mConvertProvider.CustomNullHandling == false &&
                        fieldString.HasOnlyThisChars(WhitespaceChars))
                    {
                        val = GetNullValue();
                    }
                    else
                    {
                        string from = fieldString.ExtractedString();
                        val = mConvertProvider.StringToField(from);

                        if (val == null)
                            val = GetNullValue();

                    }
                }

                return val;
            }
            catch (ConvertException ex)
            {
                throw ConvertException.ReThrowException(ex, mFieldInfo.Name, line.mReader.LineNumber, fieldString.ExtractedFrom + 1);
            }
        }