From 696d0f8fcb143ccc81bd38c4f4c4ddae07c67c32 Mon Sep 17 00:00:00 2001 From: Elias Fierke Date: Sat, 16 May 2026 18:19:09 +0200 Subject: [PATCH] [chore:] logging for DataImport.cs --- Tasks/DataImport.cs | 447 +++++++++++++++++++++++--------------------- 1 file changed, 237 insertions(+), 210 deletions(-) diff --git a/Tasks/DataImport.cs b/Tasks/DataImport.cs index d2961f6..e832dbc 100644 --- a/Tasks/DataImport.cs +++ b/Tasks/DataImport.cs @@ -20,210 +20,227 @@ public class DataImport private static async Task<(bool, KasAddressList)> ImportKasAddressListWithoutPatch(Uri pathToCsv, char separator) { - if (!File.Exists(pathToCsv.LocalPath)) + try { - Console.WriteLine($"File not found: {pathToCsv}"); - return (false, null); - } - - using var reader = new StreamReader(pathToCsv.LocalPath); - var headerLine = reader.ReadLine(); - if (headerLine == null) - { - Console.WriteLine("File is empty."); - return (false, null); - } - - var imported = new KasAddressList( - await KasAddressList.GenerateName(Path.GetFileNameWithoutExtension(pathToCsv.LocalPath))); - - while (!reader.EndOfStream) - { - var line = reader.ReadLine(); - if (string.IsNullOrWhiteSpace(line)) - continue; - - var parts = ParseCsvLine(line, separator); - - if (parts.Length < 24) + if (!File.Exists(pathToCsv.LocalPath)) { - Console.WriteLine($"Not enough columns in line: {line}"); - continue; - } - - try - { - var person = new KasPerson(KasPerson.GenerateNewID(imported.KasPersons.Count), - ParseInt(parts[0]), - parts[1], - parts[2], - parts[3], - parts[4], - parts[5], - parts[6], - parts[7], - parts[8], - parts[9], - parts[10], - parts[11], - parts[12], - parts[13], - parts[14], - parts[15], - parts[16], - parts[17], - parts[18], - parts[19], - parts[20], - parts[21], - parts[22], - parts[23] - ); - imported.KasPersons.Add(person); - } - catch (Exception ex) - { - Console.WriteLine($"Error while parsing line: {line} - {ex.Message}"); - Console.WriteLine(ex.StackTrace); + Console.WriteLine($"File not found: {pathToCsv}"); return (false, null); } + + using var reader = new StreamReader(pathToCsv.LocalPath); + var headerLine = reader.ReadLine(); + if (headerLine == null) + { + Console.WriteLine("File is empty."); + return (false, null); + } + + var imported = new KasAddressList( + await KasAddressList.GenerateName(Path.GetFileNameWithoutExtension(pathToCsv.LocalPath))); + + while (!reader.EndOfStream) + { + var line = reader.ReadLine(); + if (string.IsNullOrWhiteSpace(line)) + continue; + + var parts = ParseCsvLine(line, separator); + + if (parts.Length < 24) + { + Console.WriteLine($"Not enough columns in line: {line}"); + continue; + } + + try + { + var person = new KasPerson(KasPerson.GenerateNewID(imported.KasPersons.Count), + ParseInt(parts[0]), + parts[1], + parts[2], + parts[3], + parts[4], + parts[5], + parts[6], + parts[7], + parts[8], + parts[9], + parts[10], + parts[11], + parts[12], + parts[13], + parts[14], + parts[15], + parts[16], + parts[17], + parts[18], + parts[19], + parts[20], + parts[21], + parts[22], + parts[23] + ); + imported.KasPersons.Add(person); + } + catch (Exception ex) + { + Logger.Log($"Error while creating new kas person (import): {ex.Message}",Logger.LogType.Error); + Console.WriteLine(ex.StackTrace); + return (false, null); + } + } + + return (true, imported); + } + catch (Exception ex) + { + Logger.Log($"Error while importing kas address list without patch: {ex.Message}",Logger.LogType.Error); } - return (true, imported); + return (false, null); } private static async Task<(bool, KasAddressList)> ImportKasAddressListWithPatch(Uri pathToCsv, AddressPatch patch, char separator) { - if (!File.Exists(pathToCsv.LocalPath)) + try { - Console.WriteLine($"File not found: {pathToCsv}"); - return (false, null); - } - - using var reader = new StreamReader(pathToCsv.LocalPath); - var headerLine = reader.ReadLine(); - if (headerLine == null) - { - Console.WriteLine("File is empty."); - return (false, null); - } - - var headers = ParseCsvLine(headerLine, separator); - - var imported = new KasAddressList( - await KasAddressList.GenerateName(Path.GetFileNameWithoutExtension(pathToCsv.LocalPath))); - var patchType = typeof(AddressPatch); - var binding = BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase; - - var hasProperties = patchType.GetProperties(binding) - .Where(p => p.PropertyType == typeof(bool) && p.Name.StartsWith("has_", StringComparison.OrdinalIgnoreCase)) - .ToArray(); - - //var last_refsid = 1000000; - - while (!reader.EndOfStream) - { - var line = reader.ReadLine(); - if (string.IsNullOrWhiteSpace(line)) - continue; - - var parts = ParseCsvLine(line, separator); - - var fieldValues = new Dictionary(StringComparer.OrdinalIgnoreCase); - - //var refsid_existing = false; - - foreach (var hasProp in hasProperties) + if (!File.Exists(pathToCsv.LocalPath)) { - var fieldName = hasProp.Name.Substring(4); - - - var hasObj = hasProp.GetValue(patch); - var has = hasObj is bool b && b; - - var patchProp = patchType.GetProperty(fieldName + "_is", binding); - - string desiredHeader = null; - if (has && patchProp != null) - desiredHeader = patchProp.GetValue(patch)?.ToString(); - else - desiredHeader = fieldName; - - var resolvedValue = ""; - - if (!string.IsNullOrEmpty(desiredHeader)) - { - var idx = Array.FindIndex(headers, - h => string.Equals(h, desiredHeader, StringComparison.OrdinalIgnoreCase)); - if (idx >= 0 && idx < parts.Length) - { - resolvedValue = parts[idx]; - } - else - { - var altIdx = Array.FindIndex(headers, h => - string.Equals(h, fieldName, StringComparison.OrdinalIgnoreCase) || - string.Equals(h, fieldName + "_is", StringComparison.OrdinalIgnoreCase)); - - if (altIdx >= 0 && altIdx < parts.Length) - resolvedValue = parts[altIdx]; - else - resolvedValue = ""; - } - } - - fieldValues[fieldName] = resolvedValue ?? ""; - } - - string GetField(string name) - { - return fieldValues.TryGetValue(name, out var v) ? v : ""; - } - - var refsid = 0; - if (patch.has_refsid) - refsid = ParseInt(GetField("refsid")); - - try - { - var person = new KasPerson(KasPerson.GenerateNewID(imported.KasPersons.Count), refsid, - GetField("anrede"), - GetField("titel"), - GetField("vorname"), - GetField("adel"), - GetField("name"), - GetField("namezus"), - GetField("anredzus"), - GetField("strasse"), - GetField("strasse2"), - GetField("plz"), - GetField("ort"), - GetField("land"), - GetField("pplz"), - GetField("postfach"), - GetField("name1"), - GetField("name2"), - GetField("name3"), - GetField("name4"), - GetField("name5"), - GetField("funktion"), - GetField("funktion2"), - GetField("abteilung"), - GetField("funktionad") - ); - - imported.KasPersons.Add(person); - } - catch (Exception ex) - { - Console.WriteLine($"Error while parsing line: {line} - {ex.Message}"); - Console.WriteLine(ex.StackTrace); + Console.WriteLine($"File not found: {pathToCsv}"); return (false, null); } - } - return (true, imported); + using var reader = new StreamReader(pathToCsv.LocalPath); + var headerLine = reader.ReadLine(); + if (headerLine == null) + { + Console.WriteLine("File is empty."); + return (false, null); + } + + var headers = ParseCsvLine(headerLine, separator); + + var imported = new KasAddressList( + await KasAddressList.GenerateName(Path.GetFileNameWithoutExtension(pathToCsv.LocalPath))); + var patchType = typeof(AddressPatch); + var binding = BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase; + + var hasProperties = patchType.GetProperties(binding) + .Where(p => p.PropertyType == typeof(bool) && p.Name.StartsWith("has_", StringComparison.OrdinalIgnoreCase)) + .ToArray(); + + //var last_refsid = 1000000; + + while (!reader.EndOfStream) + { + var line = reader.ReadLine(); + if (string.IsNullOrWhiteSpace(line)) + continue; + + var parts = ParseCsvLine(line, separator); + + var fieldValues = new Dictionary(StringComparer.OrdinalIgnoreCase); + + //var refsid_existing = false; + + foreach (var hasProp in hasProperties) + { + var fieldName = hasProp.Name.Substring(4); + + + var hasObj = hasProp.GetValue(patch); + var has = hasObj is bool b && b; + + var patchProp = patchType.GetProperty(fieldName + "_is", binding); + + string desiredHeader = null; + if (has && patchProp != null) + desiredHeader = patchProp.GetValue(patch)?.ToString(); + else + desiredHeader = fieldName; + + var resolvedValue = ""; + + if (!string.IsNullOrEmpty(desiredHeader)) + { + var idx = Array.FindIndex(headers, + h => string.Equals(h, desiredHeader, StringComparison.OrdinalIgnoreCase)); + if (idx >= 0 && idx < parts.Length) + { + resolvedValue = parts[idx]; + } + else + { + var altIdx = Array.FindIndex(headers, h => + string.Equals(h, fieldName, StringComparison.OrdinalIgnoreCase) || + string.Equals(h, fieldName + "_is", StringComparison.OrdinalIgnoreCase)); + + if (altIdx >= 0 && altIdx < parts.Length) + resolvedValue = parts[altIdx]; + else + resolvedValue = ""; + } + } + + fieldValues[fieldName] = resolvedValue ?? ""; + } + + string GetField(string name) + { + return fieldValues.TryGetValue(name, out var v) ? v : ""; + } + + var refsid = 0; + if (patch.has_refsid) + refsid = ParseInt(GetField("refsid")); + + try + { + var person = new KasPerson(KasPerson.GenerateNewID(imported.KasPersons.Count), refsid, + GetField("anrede"), + GetField("titel"), + GetField("vorname"), + GetField("adel"), + GetField("name"), + GetField("namezus"), + GetField("anredzus"), + GetField("strasse"), + GetField("strasse2"), + GetField("plz"), + GetField("ort"), + GetField("land"), + GetField("pplz"), + GetField("postfach"), + GetField("name1"), + GetField("name2"), + GetField("name3"), + GetField("name4"), + GetField("name5"), + GetField("funktion"), + GetField("funktion2"), + GetField("abteilung"), + GetField("funktionad") + ); + + imported.KasPersons.Add(person); + } + catch (Exception ex) + { + Logger.Log($"Error while creating kas person (import, patch): {ex.Message}",Logger.LogType.Error); + Console.WriteLine(ex.StackTrace); + return (false, null); + } + } + + return (true, imported); + } + catch (Exception ex) + { + Logger.Log($"Error while importing kas address list with patch: {ex.Message}",Logger.LogType.Error); + } + // int GenerateNewRefsid() // { @@ -236,6 +253,7 @@ public class DataImport // last_refsid = biggest + 1; // return last_refsid; // } + return (false, null); } @@ -246,38 +264,47 @@ public class DataImport private static string[] ParseCsvLine(string line, char separator) { - var fields = new List(); - var current = new StringBuilder(); - var inQuotes = false; - - for (var i = 0; i < line.Length; i++) + try { - var c = line[i]; + var fields = new List(); + var current = new StringBuilder(); + var inQuotes = false; - if (c == '"') + for (var i = 0; i < line.Length; i++) { - if (inQuotes && i + 1 < line.Length && line[i + 1] == '"') + var c = line[i]; + + if (c == '"') { - current.Append('"'); - i++; + if (inQuotes && i + 1 < line.Length && line[i + 1] == '"') + { + current.Append('"'); + i++; + continue; + } + + inQuotes = !inQuotes; continue; } - inQuotes = !inQuotes; - continue; + if (c == separator && !inQuotes) + { + fields.Add(current.ToString().Trim()); + current.Clear(); + continue; + } + + current.Append(c); } - if (c == separator && !inQuotes) - { - fields.Add(current.ToString().Trim()); - current.Clear(); - continue; - } - - current.Append(c); + fields.Add(current.ToString().Trim()); + return fields.ToArray(); + } + catch (Exception ex) + { + Logger.Log($"Error while persing csv line: {ex.Message}",Logger.LogType.Error); } - fields.Add(current.ToString().Trim()); - return fields.ToArray(); + return []; } }