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