/// <summary>
        /// Constructor accepting cv file path and configuration for file read
        /// </summary>
        /// <param name="csvFilePath">Full CSV file path</param>
        /// <param name="csvConfiguration">Configuration to be used for reading CSV file</param>
        public CSVFileReader(string csvFilePath, CSVConfiguration csvConfiguration)
        {
            var streamReader = new StreamReader(csvFilePath);

            if (streamReader != null)
            {
                this.BaseStream = streamReader.BaseStream;
            }
            if (csvConfiguration == null)
            {
                csvConfiguration = DefaultCsvConfiguration;
            }
            this.fieldSeparator = csvConfiguration.FieldSeparator;
            this.textQualifier  = csvConfiguration.TextQualifier;

            this.textReader = new StreamReader(this.BaseStream);// new FileStream(csvSource.TextReader, FileMode.Open);

            this.ReadHeader(csvConfiguration.Header);

            this.NormalizeColumns();
        }
 /// <summary>
 /// Converts IEnumerable of object of type T into CSV record
 /// </summary>
 /// <typeparam name="T">Type to be used to covert object into CSV record</typeparam>
 /// <param name="source">Scource list of object of type T</param>
 /// <param name="csvDestination">Destination where CSV file would be written</param>
 /// <param name="csvConfiguration">Configuration to be used while writing CSV file</param>
 public static async Task ToCsv <T>(this IEnumerable <T> source, CSVDestination csvDestination, CSVConfiguration csvConfiguration) where T : BaseEntity
 {
     using (var csvFile = new CSVFile <T>(csvDestination, csvConfiguration))
     {
         foreach (var record in source)
         {
             await csvFile.Append(record);
         }
     }
 }
 /// <summary>
 /// Parameter less constructor
 /// </summary>
 static CSVFile()
 {
     DefaultCsvConfiguration = new CSVConfiguration();
     FastIndexOfAny          = true;
 }