Пример #1
0
        /// <summary>
        ///  Writes the specified file reading from the given reader
        /// </summary>
        /// <param name="reader">A Data Reader with the data</param>
        /// <param name="fileSetting">The source setting or the data that could be different than the setting for is writer</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>
        ///  Number of records written
        /// </returns>
        protected override void Write(IDataReader reader, Stream output, CancellationToken cancellationToken)
        {
            Contract.Assume(!string.IsNullOrEmpty(m_CsvFile.FullPath));

            using (var writer = new StreamWriter(output,
                                                 EncodingHelper.GetEncoding(m_CsvFile.CodePageId, m_CsvFile.ByteOrderMark), 8192))
            {
                DataReader2Stream(reader, writer, cancellationToken);
            }
        }
Пример #2
0
        /// <summary>
        ///   Writes the specified file reading from the given reader
        /// </summary>
        /// <param name="reader">A Data Reader with the data</param>
        /// <param name="output">The output.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        protected override async Task WriteReaderAsync([NotNull] IFileReader reader, [NotNull] Stream output,
                                                       CancellationToken cancellationToken)
        {
            using (var writer = new StreamWriter(output,
                                                 EncodingHelper.GetEncoding(m_CodePageId, m_ByteOrderMark), 8192))
            {
                SetColumns(reader);

                if (Columns.Count == 0)
                {
                    throw new FileWriterException("No columns defined to be written.");
                }

                HandleWriteStart();

                var sb = new StringBuilder();
                if (!string.IsNullOrEmpty(Header))
                {
                    sb.Append(Header);
                    if (!Header.EndsWith(NewLine, StringComparison.Ordinal))
                    {
                        sb.Append(NewLine);
                    }
                }

                var lastCol = Columns[Columns.Count - 1];

                if (ColumnHeader)
                {
                    foreach (var columnInfo in Columns)
                    {
                        sb.Append(TextEncodeField(FileFormat, columnInfo.Name, columnInfo, true, null, QualifyText));
                        if (!FileFormat.IsFixedLength && !ReferenceEquals(columnInfo, lastCol))
                        {
                            sb.Append(FileFormat.FieldDelimiterChar);
                        }
                    }

                    sb.Append(NewLine);
                }

                while (await reader.ReadAsync(cancellationToken).ConfigureAwait(false) &&
                       !cancellationToken.IsCancellationRequested)
                {
                    if (sb.Length > 32768)
                    {
                        await writer.WriteAsync(sb.ToString()).ConfigureAwait(false);

                        sb.Length = 0;
                    }

                    var emptyColumns = 0;

                    var row = new StringBuilder();
                    foreach (var columnInfo in Columns)
                    {
                        // Number of columns might be higher than number of reader columns
                        var col = reader.GetValue(columnInfo.ColumnOrdinal);
                        if (col == DBNull.Value || (col is string text && string.IsNullOrEmpty(text)))
                        {
                            emptyColumns++;
                        }