Пример #1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="CSF.IO.TabularDataFormat"/> class.
        /// </summary>
        /// <param name="rowDelimiter">Row delimiter.</param>
        /// <param name="columnDelimiter">Column delimiter.</param>
        /// <param name="quotationCharacter">Quotation character.</param>
        /// <param name="quotationEscapeCharacter">Quotation escape character.</param>
        /// <param name="defaultWriteOptions">Default write options.</param>
        /// <param name="disallowedCharacters">Disallowed characters.</param>
        /// <param name="trimWhitespace">If set to <c>true</c> trim whitespace.</param>
        /// <param name="tolerateEmptyRows">Whether or not empty rows will be tolerated.</param>
        public TabularDataFormat(string rowDelimiter,
                                 char columnDelimiter          = '\t',
                                 char?quotationCharacter       = null,
                                 char?quotationEscapeCharacter = null,
                                 TabularDataWriteOptions defaultWriteOptions = TabularDataWriteOptions.None,
                                 ISet <char> disallowedCharacters            = null,
                                 bool trimWhitespace    = false,
                                 bool tolerateEmptyRows = false)
        {
            if (rowDelimiter == null)
            {
                throw new ArgumentNullException("rowDelimiter");
            }
            else if (rowDelimiter.Length < 1 || rowDelimiter.Length > 2)
            {
                throw new ArgumentException("Row delimiter must be precisely 1 or two characters.", "rowDelimiter");
            }

            _rowDelimiter             = rowDelimiter;
            _columnDelimiter          = columnDelimiter;
            _quotationCharacter       = quotationCharacter;
            _quotationEscapeCharacter = quotationEscapeCharacter;
            _defaultWriteOptions      = defaultWriteOptions;
            _disallowedCharacters     = disallowedCharacters ?? new HashSet <char>();
            _trimWhitespace           = trimWhitespace;
            _tolerateEmptyLines       = tolerateEmptyRows;

            this.EnsureValidity();
        }
Пример #2
0
        /// <summary>
        /// Determines whether the given <paramref name="value"/> should be quoted when writing data.
        /// </summary>
        /// <returns>
        /// Whether or not to quote the value
        /// </returns>
        /// <param name='value'>
        /// The value to test against.
        /// </param>
        /// <param name='additionalOptions'>
        /// Additional options for writing data.
        /// </param>
        public virtual bool QuoteWhenWriting(string value, TabularDataWriteOptions additionalOptions)
        {
            bool output = false;
            TabularDataWriteOptions effectiveOptions = this.Merge(this.DefaultWriteOptions, additionalOptions);

            if (value == null)
            {
                throw new ArgumentNullException("value");
            }

            if ((effectiveOptions & TabularDataWriteOptions.AlwaysQuote) == TabularDataWriteOptions.AlwaysQuote)
            {
                // We are configured to always quote output
                output = true;
            }
            else if (this.TrimWhitespace &&
                     value.Trim() != value)
            {
                output = true;
            }
            else if (this.GetCharactersRequiringQuotation().Intersect(value.ToCharArray()).Count() > 0)
            {
                // The value contains one or more characters that require quotation
                output = true;
            }

            return(output);
        }
Пример #3
0
        /// <summary>
        /// Writes a single row of data to the <paramref name="writer"/>.
        /// </summary>
        /// <param name='row'>
        /// The row to write
        /// </param>
        /// <param name='writer'>
        /// The <see cref="TextWriter"/> to write to
        /// </param>
        /// <param name='options'>
        /// A set of <see cref="TabularDataWriteOptions"/> providing additional options for the writer.
        /// </param>
        protected virtual void Write(IList <string> row, TextWriter writer, TabularDataWriteOptions options)
        {
            if (row == null)
            {
                throw new ArgumentNullException("row");
            }
            else if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }

            for (int columnPosition = 0; columnPosition < row.Count; columnPosition++)
            {
                string valueToWrite         = row[columnPosition] ?? String.Empty;
                bool   writeColumnDelimiter = (columnPosition < row.Count - 1);

                if (this.Format.QuoteWhenWriting(valueToWrite, options))
                {
                    writer.Write(String.Format("{0}{1}{0}{2}",
                                               this.Format.QuotationCharacter,
                                               valueToWrite.Replace(this.Format.QuotationCharacter.ToString(),
                                                                    String.Concat(this.Format.QuotationEscapeCharacter,
                                                                                  this.Format.QuotationCharacter)),
                                               writeColumnDelimiter? this.Format.ColumnDelimiter.ToString() : String.Empty));
                }
                else
                {
                    writer.Write(String.Format("{0}{1}",
                                               valueToWrite,
                                               writeColumnDelimiter? this.Format.ColumnDelimiter.ToString() : String.Empty));
                }
            }
        }
Пример #4
0
        /// <summary>
        /// Writes the specified data to a string-based format.
        /// </summary>
        /// <param name='data'>
        /// The data to write.
        /// </param>
        /// <param name='options'>
        /// Additional write options to use when writing.
        /// </param>
        public virtual string Write(string[,] data, TabularDataWriteOptions options)
        {
            StringBuilder output = new StringBuilder();

            using (TextWriter writer = new StringWriter(output))
            {
                this.Write(data, writer, options);
            }

            return(output.ToString());
        }
Пример #5
0
        /// <summary>
        /// Write the specified data to a given <see cref="TextWriter"/>.
        /// </summary>
        /// <param name='data'>
        /// The tabular data structure.
        /// </param>
        /// <param name='stringDataWriter'>
        /// A <see cref="TextWriter"/> to write the output to.
        /// </param>
        /// <param name='options'>
        /// The options to use when writing the data.
        /// </param>
        public virtual void Write(TabularData data, TextWriter stringDataWriter, TabularDataWriteOptions options)
        {
            if (data == null)
            {
                throw new ArgumentNullException("data");
            }

            int rowCount = data.GetRowCount();

            for (int rowNumber = 0; rowNumber < rowCount; rowNumber++)
            {
                IList <string> row = data[rowNumber];
                this.Write(row, stringDataWriter, options);

                if (rowNumber < rowCount - 1)
                {
                    stringDataWriter.Write(this.Format.RowDelimiter);
                }
            }
        }
Пример #6
0
 /// <summary>
 /// Merge the two sets of <see cref="TabularDataWriteOptions"/> together to produce a combined set of options.
 /// </summary>
 /// <param name='first'>
 /// The first set of options.
 /// </param>
 /// <param name='second'>
 /// The second set of options.
 /// </param>
 public virtual TabularDataWriteOptions Merge(TabularDataWriteOptions first, TabularDataWriteOptions second)
 {
     return(first | second);
 }
Пример #7
0
        /// <summary>
        /// Write the specified data to a given <see cref="TextWriter"/>.
        /// </summary>
        /// <param name='data'>
        /// The data to write.
        /// </param>
        /// <param name='stringDataWriter'>
        /// A <see cref="TextWriter"/> to write the data to.
        /// </param>
        /// <param name='options'>
        /// Additional write options to use when writing.
        /// </param>
        public virtual void Write(string[,] data, TextWriter stringDataWriter, TabularDataWriteOptions options)
        {
            var tabularData = new TabularArrayData(data);

            this.Write(tabularData, stringDataWriter, options);
        }
Пример #8
0
        /// <summary>
        /// Write the specified data to a given <see cref="TextWriter"/>.
        /// </summary>
        /// <param name='data'>
        /// The tabular data structure.
        /// </param>
        /// <param name='stringDataWriter'>
        /// A <see cref="TextWriter"/> to write the output to.
        /// </param>
        /// <param name='options'>
        /// The options to use when writing the data.
        /// </param>
        public virtual void Write(IList <IList <string> > data, TextWriter stringDataWriter, TabularDataWriteOptions options)
        {
            var tabularData = new TabularListData(data);

            this.Write(tabularData, stringDataWriter, options);
        }