Files
logofclient/DataImport.cs
2025-10-03 16:36:22 +02:00

115 lines
3.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.IO;
namespace Logof_Client;
public class DataImport
{
public static (bool, KasAddressList) ImportKasAddressList(Uri pathToCsv, AddressPatch patch = null,
char separator = ',')
{
// Prüfen, ob die Datei existiert
if (!File.Exists(pathToCsv.LocalPath))
{
Console.WriteLine($"File not found: {pathToCsv}");
return (false, null);
}
using var reader = new StreamReader(pathToCsv.LocalPath);
// Erste Zeile: CSV-Header lesen
var headerLine = reader.ReadLine();
if (headerLine == null)
{
Console.WriteLine("File is empty.");
return (false, null);
}
var headers = headerLine.Split(separator); // Header in Spaltennamen aufteilen (z. B. name, vorname, ort, ...)
// Neue Adressliste anlegen
var imported = new KasAddressList(Path.GetFileNameWithoutExtension(pathToCsv.LocalPath));
// Zeilenweise durchgehen
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
if (string.IsNullOrWhiteSpace(line))
continue;
var parts = line.Split(separator);
// Werte-Array vorbereiten immer 24 Felder für KasPerson
var values = new string[24];
for (var i = 0; i < 24; i++)
if (i < parts.Length)
values[i] = parts[i];
else
values[i] = ""; // fehlende Spalten leer lassen
// Patch anwenden (falls vorhanden)
if (patch != null)
for (var i = 0; i < headers.Length; i++)
{
var header = headers[i].Trim(); // z. B. "name", "vorname", "ort"
// Das zugehörige Patch-Feld heißt z. B. "name_is"
var patchProperty = typeof(AddressPatch).GetProperty(header + "_is");
var hasProperty = typeof(AddressPatch).GetProperty("has_" + header);
if (patchProperty != null && hasProperty != null)
// Prüfen, ob das Patch-Feld aktiv ist
if ((bool)hasProperty.GetValue(patch))
// Dann den Wert aus dem Patch übernehmen
values[i] = (string)patchProperty.GetValue(patch);
}
try
{
// KasPerson erstellen Reihenfolge der Werte muss mit dem Konstruktor übereinstimmen
var person = new KasPerson(
ParseInt(values[0]),
values[1],
values[2],
values[3],
values[4],
values[5],
values[6],
values[7],
values[8],
values[9],
ParseInt(values[10]),
values[11],
values[12],
ParseInt(values[13]),
values[14],
values[15],
values[16],
values[17],
values[18],
values[19],
values[20],
values[21],
values[22],
values[23]
);
imported.KasPersons.Add(person);
}
catch (Exception ex)
{
Console.WriteLine($"Error while parsing line: {line} - {ex.Message}");
Console.WriteLine(ex.StackTrace);
return (false, null);
}
}
return (true, imported);
}
private static int ParseInt(string input)
{
return int.TryParse(input, out var result) ? result : 0;
}
}