From a7a3c5a82eb5e262883eb81baf85ebdeb71717b8 Mon Sep 17 00:00:00 2001 From: Torben Nehmer Date: Thu, 15 Aug 2024 22:17:12 +0200 Subject: [PATCH] extract CSV code to independant class, so that we don't pollute the EF classes with CSV stuff. --- Stars Assistant/CSV/Planet.cs | 278 ++++++++++++++++++++++++++++++++ Stars Assistant/Model/Planet.cs | 155 +----------------- Stars Assistant/Program.cs | 6 +- 3 files changed, 284 insertions(+), 155 deletions(-) create mode 100644 Stars Assistant/CSV/Planet.cs diff --git a/Stars Assistant/CSV/Planet.cs b/Stars Assistant/CSV/Planet.cs new file mode 100644 index 0000000..a387716 --- /dev/null +++ b/Stars Assistant/CSV/Planet.cs @@ -0,0 +1,278 @@ +using System.ComponentModel.DataAnnotations; +using System.Globalization; +using CsvHelper.Configuration.Attributes; + +namespace StarsAssistant.CSV; + +public class Planet +{ + [Index(0)] + public required string Name { get; set; } + + [Index(1)] + public string? Owner { get; set; } + + [Index(2)] + public string? StarbaseType { get; set; } + + [Index(3)] + public int ReportAge { get; set; } = 0; + + [Index(4)] + public int? Population { get; set; } + + [Ignore()] + public int? Value { get; private set; } + + [Index(5)] + public string CSVValue { + set { + if ( value.Length >= 2 + && int.TryParse(value[..^1], out int result)) + { + Value = result; + } else { + Value = null; + } + } + } + + [Index(7)] + public int? Mines { get; set; } + + [Index(8)] + public int? Factories { get; set; } + + [Ignore()] + public decimal? DefPercent { get; private set; } + + [Index(9)] + public string CSVDefPercent { + set { + if ( value.Length >= 2 + && Decimal.TryParse(value[..^1], NumberStyles.Float, CultureInfo.InvariantCulture, out decimal result)) + { + DefPercent = result; + } else { + DefPercent = null; + } + } + } + + [Index(10)] + public int? SurfaceIronium { get; set; } + + [Index(11)] + public int? SurfaceBoranium { get; set; } + + [Index(12)] + public int? SurfaceGermanium { get; set; } + + [Index(13)] + public int? MRIronium { get; set; } + + [Index(14)] + public int? MRBoranium { get; set; } + + [Index(15)] + public int? MRGermanium { get; set; } + + [Index(16)] + public int? MCIronium { get; set; } + + [Index(17)] + public int? MCBoranium { get; set; } + + [Index(18)] + public int? MCGermanium { get; set; } + + [Index(19)] + public int? Resources { get; set; } + + [Ignore()] + public decimal? Gravity { get; private set; } + + [Index(20)] + public string CSVGravity { + set { + if ( value.Length >= 2 + && Decimal.TryParse(value[..^1], NumberStyles.Float, CultureInfo.InvariantCulture, out decimal result)) + { + Gravity = result; + } else { + Gravity = null; + } + } + } + + [Ignore()] + public decimal? Temperature { get; private set; } + + [Index(21)] + public string CSVTemperature { + set { + if ( value.Length >= 3 + && Decimal.TryParse(value[..^2], NumberStyles.Float, CultureInfo.InvariantCulture, out decimal result)) + { + Temperature = result; + } else { + Temperature = null; + } + } + } + + [Ignore()] + public decimal? Radiation { get; private set; } + + [Index(22)] + public string CSVRadiation { + set { + if ( value.Length >= 3 + && Decimal.TryParse(value[..^2], NumberStyles.Float, CultureInfo.InvariantCulture, out decimal result)) + { + Radiation = result; + } else { + Radiation = null; + } + } + } + + [Ignore()] + public decimal? GravityOrig { get; private set; } + + [Index(20)] + public string CSVGravityOrig { + set { + if ( value.Length >= 2 + && Decimal.TryParse(value[..^1], NumberStyles.Float, CultureInfo.InvariantCulture, out decimal result)) + { + GravityOrig = result; + } else { + GravityOrig = null; + } + } + } + [Ignore()] + public decimal? TemperatureOrig { get; private set; } + + [Index(24)] + public string CSVTemperatureOrig { + set { + if ( value.Length >= 3 + && Decimal.TryParse(value[..^2], NumberStyles.Float, CultureInfo.InvariantCulture, out decimal result)) + { + TemperatureOrig = result; + } else { + TemperatureOrig = null; + } + } + } + + [Ignore()] + public decimal? RadiationOrig { get; private set; } + + [Index(25)] + public string CSVRadiationOrig { + set { + if ( value.Length >= 3 + && Decimal.TryParse(value[..^2], NumberStyles.Float, CultureInfo.InvariantCulture, out decimal result)) + { + RadiationOrig = result; + } else { + RadiationOrig = null; + } + } + } + + [Ignore()] + public int? MaxTerraforming { get; private set; } + + [Index(26)] + public string CSVMaxTerraforming { + set { + if ( value.Length >= 2 + && int.TryParse(value[..^1], out int result)) + { + MaxTerraforming = result; + } else { + MaxTerraforming = null; + } + } + } + + [Index(27)] + public int? CapacityPercent { get; set; } + + [Index(28)] + public int? ScanRange { get; set; } + + [Index(29)] + public int? PenScanRange { get; set; } + + [Index(30)] + public int? Driver { get; set; } + + [Index(31)] + public int? DriverWarp { get; set; } + + [Index(32)] + public string? RouteTarget { get; set; } + + [Index(33)] + public int? GateRange { get; set; } + + [Index(34)] + public int? GateMass { get; set; } + + [Index(35)] + public int? PctDamage { get; set; } + + /// + /// This will update a DB Planet recrod with this CSV Data. The PK (Planet Name) + /// must already be set, DB/EF Handling has to be done by the caller, we'll take + /// care of none PK properties only. + /// + /// + public void UpdateDbPlanet(Model.Planet dbPlanet) + { + if (dbPlanet == null) + throw new InvalidOperationException("Cannot update a null DB Planet instance"); + if (dbPlanet.Name != Name) + throw new InvalidOperationException($"DB Planet Name {dbPlanet.Name} does not macth the CSV Planet Name {Name}"); + + dbPlanet.Owner = Owner; + dbPlanet.StarbaseType = StarbaseType; + dbPlanet.ReportAge = ReportAge; + dbPlanet.Population = Population; + dbPlanet.Value = Value; + dbPlanet.Mines = Mines; + dbPlanet.Factories = Factories; + dbPlanet.DefPercent = DefPercent; + dbPlanet.SurfaceIronium = SurfaceIronium; + dbPlanet.SurfaceBoranium = SurfaceBoranium; + dbPlanet.SurfaceGermanium = SurfaceGermanium; + dbPlanet.MRIronium = MRIronium; + dbPlanet.MRBoranium = MRBoranium; + dbPlanet.MRGermanium = MRGermanium; + dbPlanet.MCIronium = MCIronium; + dbPlanet.MCBoranium = MCBoranium; + dbPlanet.MCGermanium = MCGermanium; + dbPlanet.Resources = Resources; + dbPlanet.Gravity = Gravity; + dbPlanet.Radiation = Radiation; + dbPlanet.Temperature = Temperature; + dbPlanet.GravityOrig = GravityOrig; + dbPlanet.TemperatureOrig = TemperatureOrig; + dbPlanet.RadiationOrig = RadiationOrig; + dbPlanet.MaxTerraforming = MaxTerraforming; + dbPlanet.CapacityPercent = CapacityPercent; + dbPlanet.ScanRange = ScanRange; + dbPlanet.PenScanRange = PenScanRange; + dbPlanet.Driver = Driver; + dbPlanet.DriverWarp = DriverWarp; + dbPlanet.RouteTarget = RouteTarget; + dbPlanet.GateRange = GateRange; + dbPlanet.GateMass = GateMass; + dbPlanet.PctDamage = PctDamage; + } +} \ No newline at end of file diff --git a/Stars Assistant/Model/Planet.cs b/Stars Assistant/Model/Planet.cs index 8ec66f9..1eaeb19 100644 --- a/Stars Assistant/Model/Planet.cs +++ b/Stars Assistant/Model/Planet.cs @@ -1,229 +1,78 @@ using System.ComponentModel.DataAnnotations; using System.Globalization; -using CSV = CsvHelper.Configuration.Attributes; namespace StarsAssistant.Model; public class Planet { - [Key, CSV.Index(0)] + [Key] public required string Name { get; set; } - [CSV.Index(1)] public string? Owner { get; set; } - [CSV.Index(2)] public string? StarbaseType { get; set; } - [CSV.Index(3)] public int ReportAge { get; set; } = 0; - [CSV.Index(4)] public int? Population { get; set; } - [CSV.Ignore()] public int? Value { get; set; } - - [CSV.Index(5)] - public string CSVValue { - set { - if ( value.Length >= 2 - && int.TryParse(value[..^1], out int result)) - { - Value = result; - } else { - Value = null; - } - } - } - [CSV.Index(7)] public int? Mines { get; set; } - [CSV.Index(8)] public int? Factories { get; set; } - [CSV.Ignore()] public decimal? DefPercent { get; set; } - [CSV.Index(9)] - public string CSVDefPercent { - set { - if ( value.Length >= 2 - && Decimal.TryParse(value[..^1], NumberStyles.Float, CultureInfo.InvariantCulture, out decimal result)) - { - DefPercent = result; - } else { - DefPercent = null; - } - } - } - - [CSV.Index(10)] public int? SurfaceIronium { get; set; } - [CSV.Index(11)] public int? SurfaceBoranium { get; set; } - [CSV.Index(12)] public int? SurfaceGermanium { get; set; } - [CSV.Index(13)] public int? MRIronium { get; set; } - [CSV.Index(14)] public int? MRBoranium { get; set; } - [CSV.Index(15)] public int? MRGermanium { get; set; } - [CSV.Index(16)] public int? MCIronium { get; set; } - [CSV.Index(17)] public int? MCBoranium { get; set; } - [CSV.Index(18)] - public int? MCGrmanium { get; set; } + public int? MCGermanium { get; set; } - [CSV.Index(19)] public int? Resources { get; set; } - [CSV.Ignore()] public decimal? Gravity { get; set; } - - [CSV.Index(20)] - public string CSVGravity { - set { - if ( value.Length >= 2 - && Decimal.TryParse(value[..^1], NumberStyles.Float, CultureInfo.InvariantCulture, out decimal result)) - { - Gravity = result; - } else { - Gravity = null; - } - } - } - [CSV.Ignore()] public decimal? Temperature { get; set; } - - [CSV.Index(21)] - public string CSVTemperature { - set { - if ( value.Length >= 3 - && Decimal.TryParse(value[..^2], NumberStyles.Float, CultureInfo.InvariantCulture, out decimal result)) - { - Temperature = result; - } else { - Temperature = null; - } - } - } - [CSV.Ignore()] public decimal? Radiation { get; set; } - [CSV.Index(22)] - public string CSVRadiation { - set { - if ( value.Length >= 3 - && Decimal.TryParse(value[..^2], NumberStyles.Float, CultureInfo.InvariantCulture, out decimal result)) - { - Radiation = result; - } else { - Radiation = null; - } - } - } - - [CSV.Ignore()] public decimal? GravityOrig { get; set; } - [CSV.Index(20)] - public string CSVGravityOrig { - set { - if ( value.Length >= 2 - && Decimal.TryParse(value[..^1], NumberStyles.Float, CultureInfo.InvariantCulture, out decimal result)) - { - GravityOrig = result; - } else { - GravityOrig = null; - } - } - } - [CSV.Ignore()] public decimal? TemperatureOrig { get; set; } - [CSV.Index(24)] - public string CSVTemperatureOrig { - set { - if ( value.Length >= 3 - && Decimal.TryParse(value[..^2], NumberStyles.Float, CultureInfo.InvariantCulture, out decimal result)) - { - TemperatureOrig = result; - } else { - TemperatureOrig = null; - } - } - } - - [CSV.Ignore()] public decimal? RadiationOrig { get; set; } - [CSV.Index(25)] - public string CSVRadiationOrig { - set { - if ( value.Length >= 3 - && Decimal.TryParse(value[..^2], NumberStyles.Float, CultureInfo.InvariantCulture, out decimal result)) - { - RadiationOrig = result; - } else { - RadiationOrig = null; - } - } - } - - [CSV.Ignore()] public int? MaxTerraforming { get; set; } - [CSV.Index(26)] - public string CSVMaxTerraforming { - set { - if ( value.Length >= 2 - && int.TryParse(value[..^1], out int result)) - { - MaxTerraforming = result; - } else { - MaxTerraforming = null; - } - } - } - - [CSV.Index(27)] public int? CapacityPercent { get; set; } - [CSV.Index(28)] public int? ScanRange { get; set; } - [CSV.Index(29)] public int? PenScanRange { get; set; } - [CSV.Index(30)] public int? Driver { get; set; } - [CSV.Index(31)] public int? DriverWarp { get; set; } - [CSV.Index(32)] public string? RouteTarget { get; set; } - [CSV.Index(33)] public int? GateRange { get; set; } - [CSV.Index(34)] public int? GateMass { get; set; } - [CSV.Index(35)] public int? PctDamage { get; set; } } \ No newline at end of file diff --git a/Stars Assistant/Program.cs b/Stars Assistant/Program.cs index 08f5c5b..6c5980a 100644 --- a/Stars Assistant/Program.cs +++ b/Stars Assistant/Program.cs @@ -50,9 +50,11 @@ sealed class Program using (var reader = new StreamReader("/home/torben/goingth/GOINGTH.p1", System.Text.Encoding.Latin1)) using (var csv = new CsvReader(reader, config)) { - List records = csv.GetRecords().ToList(); - foreach (Planet p in records) + List records = csv.GetRecords().ToList(); + foreach (CSV.Planet csvp in records) { + Planet p = new Planet{ Name = csvp.Name }; + csvp.UpdateDbPlanet(p); db.Add(p); } db.SaveChanges();