예제 #1
0
        /// <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);
     }
 }
예제 #5
0
        /// <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");
        }
예제 #7
0
        /// <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");
            }
        }