using System; using System.Collections.Generic; using System.Globalization; using System.IO; using CsvHelper; using CsvHelper.Configuration; using MileageTraker.Web.Models; using MileageTraker.Web.Utility; namespace MileageTraker.Web.DAL { public class FuelmanCsvImporter { private sealed class FuelmanCsvClassMap : CsvClassMap { public FuelmanCsvClassMap() { Map(m => m.Date).ConvertUsing(row => { var date = row.GetField("CEDATE"); var time = row.GetField("CETIME"); var dttm = string.Format(@"{0} {1:00:00}", date, time); return DateTime.ParseExact(dttm, @"M/d/yyyy HH:mm", CultureInfo.InvariantCulture); }); Map(m => m.DriverFullName).ConvertUsing(row => { var name = row.GetField("CEEMNAME"); return NameNormalizer.Normalize(name); }); Map(m => m.TagNumber).Name("CEVEHNO"); Map(m => m.Odometer).Name("CEODOMETER"); Map(m => m.CityName).ConvertUsing(row => { var city = row.GetField("CESITCTY"); return city.ToLower().ToTitleCase(); }); Map(m => m.MPG).Name("CEMPG"); Map(m => m.GasPurchased).Name("CEQTY"); Map(m => m.TotalPrice).Name("CECUSAMT"); } } public static IEnumerable Import(string filename) { var fileInfo = new FileInfo(filename); if (!fileInfo.Exists) throw new ImportException("Cannot find file '" + filename + "'"); using (var tr = File.OpenText(fileInfo.FullName)) { var csv = new CsvReader(tr); csv.Configuration.RegisterClassMap(); var fuelLogs = new List(); while (csv.Read()) { try { // Skip non-FUEL entries if (csv.GetField("CEPRDTYPE") != "FUEL") continue; fuelLogs.Add(csv.GetRecord()); } catch (Exception ex) { throw new ImportException("Problem with document encountered on row " + csv.Row + ". " + ex.Message); } } return fuelLogs; } } } }