extract CSV code to independant class, so that we don't pollute the EF classes with CSV stuff.

This commit is contained in:
Torben Nehmer 2024-08-15 22:17:12 +02:00
parent 2b1ce291eb
commit a7a3c5a82e
No known key found for this signature in database
3 changed files with 284 additions and 155 deletions

View File

@ -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; }
/// <summary>
/// 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.
/// </summary>
/// <param name="dbPlanet"></param>
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;
}
}

View File

@ -1,229 +1,78 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Globalization; using System.Globalization;
using CSV = CsvHelper.Configuration.Attributes;
namespace StarsAssistant.Model; namespace StarsAssistant.Model;
public class Planet public class Planet
{ {
[Key, CSV.Index(0)] [Key]
public required string Name { get; set; } public required string Name { get; set; }
[CSV.Index(1)]
public string? Owner { get; set; } public string? Owner { get; set; }
[CSV.Index(2)]
public string? StarbaseType { get; set; } public string? StarbaseType { get; set; }
[CSV.Index(3)]
public int ReportAge { get; set; } = 0; public int ReportAge { get; set; } = 0;
[CSV.Index(4)]
public int? Population { get; set; } public int? Population { get; set; }
[CSV.Ignore()]
public int? Value { get; set; } 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; } public int? Mines { get; set; }
[CSV.Index(8)]
public int? Factories { get; set; } public int? Factories { get; set; }
[CSV.Ignore()]
public decimal? DefPercent { get; set; } 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; } public int? SurfaceIronium { get; set; }
[CSV.Index(11)]
public int? SurfaceBoranium { get; set; } public int? SurfaceBoranium { get; set; }
[CSV.Index(12)]
public int? SurfaceGermanium { get; set; } public int? SurfaceGermanium { get; set; }
[CSV.Index(13)]
public int? MRIronium { get; set; } public int? MRIronium { get; set; }
[CSV.Index(14)]
public int? MRBoranium { get; set; } public int? MRBoranium { get; set; }
[CSV.Index(15)]
public int? MRGermanium { get; set; } public int? MRGermanium { get; set; }
[CSV.Index(16)]
public int? MCIronium { get; set; } public int? MCIronium { get; set; }
[CSV.Index(17)]
public int? MCBoranium { get; set; } public int? MCBoranium { get; set; }
[CSV.Index(18)] public int? MCGermanium { get; set; }
public int? MCGrmanium { get; set; }
[CSV.Index(19)]
public int? Resources { get; set; } public int? Resources { get; set; }
[CSV.Ignore()]
public decimal? Gravity { get; set; } 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; } 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; } 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; } 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; } 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; } 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; } 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; } public int? CapacityPercent { get; set; }
[CSV.Index(28)]
public int? ScanRange { get; set; } public int? ScanRange { get; set; }
[CSV.Index(29)]
public int? PenScanRange { get; set; } public int? PenScanRange { get; set; }
[CSV.Index(30)]
public int? Driver { get; set; } public int? Driver { get; set; }
[CSV.Index(31)]
public int? DriverWarp { get; set; } public int? DriverWarp { get; set; }
[CSV.Index(32)]
public string? RouteTarget { get; set; } public string? RouteTarget { get; set; }
[CSV.Index(33)]
public int? GateRange { get; set; } public int? GateRange { get; set; }
[CSV.Index(34)]
public int? GateMass { get; set; } public int? GateMass { get; set; }
[CSV.Index(35)]
public int? PctDamage { get; set; } public int? PctDamage { get; set; }
} }

View File

@ -50,9 +50,11 @@ sealed class Program
using (var reader = new StreamReader("/home/torben/goingth/GOINGTH.p1", System.Text.Encoding.Latin1)) using (var reader = new StreamReader("/home/torben/goingth/GOINGTH.p1", System.Text.Encoding.Latin1))
using (var csv = new CsvReader(reader, config)) using (var csv = new CsvReader(reader, config))
{ {
List<Planet> records = csv.GetRecords<Planet>().ToList(); List<CSV.Planet> records = csv.GetRecords<CSV.Planet>().ToList();
foreach (Planet p in records) foreach (CSV.Planet csvp in records)
{ {
Planet p = new Planet{ Name = csvp.Name };
csvp.UpdateDbPlanet(p);
db.Add(p); db.Add(p);
} }
db.SaveChanges(); db.SaveChanges();