/// <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(); }
/// <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); }
/// <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)); } } }
/// <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()); }
/// <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); } } }
/// <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); }
/// <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); }
/// <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); }