/// <summary> /// Exporta los datos de un comando /// </summary> private void Export(string fileName, ProviderModel provider, CommandModel command, SentenceExportCsv sentence, BlockLogModel block) { using (IDataReader reader = provider.OpenReader(command, sentence.Timeout)) { long records = 0; // Escribe en el archivo using (CsvWriter writer = new CsvWriter(sentence.Definition)) { List <ColumnModel> columns = GetColumns(reader); // Crea el directorio del archivo LibHelper.Files.HelperFiles.MakePath(System.IO.Path.GetDirectoryName(fileName)); // Abre el archivo writer.Open(fileName); // Añade las cabeceras writer.WriteHeaders(GetHeaders(columns, sentence.Definition.TypedHeader)); // Graba las líneas while (reader.Read()) { // Graba los valores writer.WriteRow(GetValues(columns, reader)); // Lanza el evento de progreso if (++records % sentence.BatchSize == 0) { block.Progress($"Copying {records:#,##0}", records, 0); } } // Log block.Info($"Exported {records:#,##0} records"); } } }
/// <summary> /// Exporta la tabla a CSV /// </summary> private async Task ExportToCsvAsync(BlockLogModel block, string fileName, DbDataReader reader, CancellationToken cancellationToken) { LibCsvFiles.Controllers.CsvDataReaderWriter writer = new LibCsvFiles.Controllers.CsvDataReaderWriter(); // Asigna el evento de progreso writer.Progress += (sender, args) => block.Progress(System.IO.Path.GetFileName(fileName), args.Records, args.Records + 1); // Graba el archivo await writer.SaveAsync(reader, fileName, cancellationToken); }
/// <summary> /// Obtiene el generador de archivos parquet /// </summary> private ParquetWriter GetDataWriter(string fileName, int recordsPerBlock, BlockLogModel block) { ParquetWriter writer = new ParquetWriter(fileName, recordsPerBlock); // Asigna el manejador de eventos writer.Progress += (sender, args) => block.Progress("Writing to file", args.Records, 0); // Devuelve el generador return(writer); }
/// <summary> /// Exporta la tabla a parquet /// </summary> private async Task ExportToParquetAsync(BlockLogModel block, string fileName, DbDataReader reader, CancellationToken cancellationToken) { using (LibParquetFiles.Writers.ParquetWriterAsync writer = new LibParquetFiles.Writers.ParquetWriterAsync(fileName)) { // Asigna el evento de progreso writer.Progress += (sender, args) => block.Progress(System.IO.Path.GetFileName(fileName), args.Records, args.Records + 1); // Graba el archivo await writer.WriteAsync(reader, cancellationToken); } }
/// <summary> /// Importa los datos del archivo sobre el proveedor /// </summary> private void Import(ProviderModel provider, SentenceImportCsv sentence, string fileName, BlockLogModel block) { long records = 0; // Copia del origen al destino using (CsvReader reader = new CsvReader(fileName, sentence.Definition, sentence.Columns, sentence.BatchSize)) { // Asigna el manejador de eventos reader.ReadBlock += (sender, args) => block.Progress("Importing", args.Records, 0); // Copia los datos del archivo sobre la tabla records = provider.BulkCopy(reader, sentence.Table, sentence.Mappings, sentence.BatchSize, sentence.Timeout); } // Log block.Info($"Imported {records:#,##0} records"); }
/// <summary> /// Importa el archivo /// </summary> private void Import(BlockLogModel block, ProviderModel provider, SentenceImportParquet sentence, string fileName) { long records = 0; // Copia del origen al destino using (ParquetDataReader reader = new ParquetDataReader(fileName, sentence.RecordsPerBlock)) { // Asigna el manejador de eventos reader.Progress += (sender, args) => block.Progress("Importing", args.Records, 0); // Copia los datos del archivo sobre la tabla records = provider.BulkCopy(reader, sentence.Table, sentence.Mappings, sentence.RecordsPerBlock, sentence.Timeout); } // Log block.Info($"Imported {records:#,##0} records"); }
/// <summary> /// Exporta el resultado del comando /// </summary> private void Export(ProviderModel provider, CommandModel command, SentenceExportPartitionedCsv sentence, string baseFileName, BlockLogModel block) { using (IDataReader reader = provider.OpenReader(command, sentence.Timeout)) { long records = 0; List <ColumnModel> headers = GetColumns(reader); string partitionKey = string.Empty; CsvWriter writer = null; // Lee los registros y los va grabando en particiones while (reader.Read()) { string actualPartition = GetPartitionKey(sentence.Columns, sentence.PartitionSeparator, reader); // Cambia la partición if (!actualPartition.EqualsIgnoreCase(partitionKey)) { string fileName = GetFileName(baseFileName, sentence.PartitionSeparator, actualPartition); // Log block.Info($"Opening the file: {fileName}"); // Cierra el archivo si ya existía CloseFile(writer); // Abre un nuevo archivo writer = OpenFile(sentence, headers, fileName); // Cambia la clave de partición partitionKey = actualPartition; } // Añade la línea writer.WriteRow(GetValues(headers, reader)); // Lanza el evento de progreso if (++records % sentence.BatchSize == 0) { block.Progress("Copying", records, 0); } } // Cierra el archivo si estaba abierto CloseFile(writer); // Log block.Info($"Exported {records:#,##0} records"); } }