2024-09-06 10:56:31 +02:00

304 lines
12 KiB
C#

using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using MySql.Data.MySqlClient;
namespace PMCProjekt
{
internal class Programm
{
static void Main(string[] args)
{
string dateiPfad = "/Schule/PMC/import_yutani.csv";
string protokollPfad = "/Schule/PMC/ungueltige_Daten.csv";
// MySQL-Verbindungszeichenfolge
string connectionString = "server=localhost;uid=root;pwd=root;database=import_export";
// Abfrage der Kundennummer vom Benutzer
Console.Write("Bitte geben Sie die Kundennummer (clientno) ein: ");
string clientno = Console.ReadLine();
int clientId = HoleClientId(connectionString, clientno);
if (clientId == 0)
{
Console.WriteLine("Ungültige Kundennummer. Programm wird beendet.");
return;
}
List<List<string>> alleDatensaetze = new List<List<string>>();
List<string> aktuellerDatensatz = new List<string>();
// Überprüfen, ob die Datei existiert
if (File.Exists(dateiPfad))
{
using (StreamReader sr = new StreamReader(dateiPfad))
{
string zeile;
while ((zeile = sr.ReadLine()) != null)
{
if (zeile.StartsWith("Frau") || zeile.StartsWith("Herr") || zeile.StartsWith("Divers"))
{
// Wenn ein neuer Datensatz beginnt, speichere den vorherigen
if (aktuellerDatensatz.Count > 0)
{
alleDatensaetze.Add(new List<string>(aktuellerDatensatz));
aktuellerDatensatz.Clear();
}
}
// Füge die aktuelle Zeile dem Datensatz hinzu
aktuellerDatensatz.Add(zeile);
}
// Füge den letzten Datensatz hinzu, falls vorhanden
if (aktuellerDatensatz.Count > 0)
{
alleDatensaetze.Add(aktuellerDatensatz);
}
}
// Verarbeitung aller gesammelten Datensätze
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
connection.Open();
foreach (var datensatz in alleDatensaetze)
{
VerarbeiteDatensatz(datensatz, protokollPfad, connection, clientId);
}
}
}
else
{
Console.WriteLine("Datei nicht gefunden.");
}
}
static int HoleClientId(string connectionString, string clientno)
{
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
connection.Open();
string query = "SELECT id FROM client WHERE clientno = @ClientNo";
using (MySqlCommand command = new MySqlCommand(query, connection))
{
command.Parameters.AddWithValue("@ClientNo", clientno);
var result = command.ExecuteScalar();
return result != null ? Convert.ToInt32(result) : 0;
}
}
}
static void VerarbeiteDatensatz(List<string> datensatz, string protokollPfad, MySqlConnection connection, int clientId)
{
string gesamteZeile = string.Join(";", datensatz);
string[] werte = gesamteZeile.Split(';');
string anrede = "";
string vorname = "";
string nachname = "";
string geburtsdatum = "";
string strasse = "";
string plz = "";
string stadt = "";
string email = "";
List<string> telefonnummern = new List<string>();
for (int i = 0; i < werte.Length; i++)
{
if (werte[i] == "Frau" || werte[i] == "Herr" || werte[i] == "Divers")
{
anrede = werte[i];
vorname = werte[i + 1];
nachname = werte[i + 2];
geburtsdatum = werte[i + 3];
i += 3;
}
else if (werte[i] == "Adresse")
{
strasse = werte[i + 1];
plz = werte[i + 2];
stadt = werte[i + 3];
i += 3;
}
else if (werte[i] == "E-Mail")
{
email = werte[i + 1];
i += 1;
}
else if (werte[i] == "Telefon")
{
telefonnummern.Add($"{werte[i + 1]} {werte[i + 2]}");
i += 2;
}
}
bool gueltig = true;
if (!PruefeGeburtstag(geburtsdatum))
{
Console.WriteLine($"Ungültiges Geburtsdatum: {geburtsdatum}");
gueltig = false;
}
if (!string.IsNullOrEmpty(email) && !PruefeEmail(email))
{
Console.WriteLine($"Ungültige E-Mail-Adresse: {email}");
gueltig = false;
}
if (!string.IsNullOrEmpty(plz) && !PruefePLZ(plz))
{
Console.WriteLine($"Ungültige Postleitzahl: {plz}");
gueltig = false;
}
foreach (var telefon in telefonnummern)
{
if (!PruefeTelefon(telefon))
{
Console.WriteLine($"Ungültige Telefonnummer: {telefon}");
gueltig = false;
}
}
if (gueltig)
{
int userId = GeneriereNaechsteId("user", connection);
EinfuegenInUserTabelle(userId, anrede, vorname, nachname, geburtsdatum, connection, clientId);
EinfuegenInAddressTabelle(GeneriereNaechsteId("address", connection), userId, strasse, plz, stadt, connection);
EinfuegenInEmailTabelle(GeneriereNaechsteId("email", connection), userId, email, connection);
foreach (var telefon in telefonnummern)
{
string[] telefonTeile = telefon.Split(' ');
EinfuegenInPhoneTabelle(GeneriereNaechsteId("phone", connection), userId, telefonTeile[0], telefonTeile[1], connection);
}
}
else
{
ProtokolliereUngueltigeDaten(datensatz, protokollPfad);
}
}
static int GeneriereNaechsteId(string tabelle, MySqlConnection connection)
{
string query = $"SELECT IFNULL(MAX(id), 0) + 1 FROM {tabelle}";
using (MySqlCommand command = new MySqlCommand(query, connection))
{
return Convert.ToInt32(command.ExecuteScalar());
}
}
static void EinfuegenInUserTabelle(int userId, string anrede, string vorname, string nachname, string geburtsdatum, MySqlConnection connection, int clientId)
{
string query = "INSERT INTO user (id, clientId, genderId, firstname, lastname, birthdate, created) " +
"VALUES (@Id, @ClientId, @GenderId, @Vorname, @Nachname, @Geburtsdatum, @Created)";
using (MySqlCommand command = new MySqlCommand(query, connection))
{
command.Parameters.AddWithValue("@Id", userId);
command.Parameters.AddWithValue("@ClientId", clientId);
command.Parameters.AddWithValue("@GenderId", GetGenderId(anrede, connection));
command.Parameters.AddWithValue("@Vorname", vorname);
command.Parameters.AddWithValue("@Nachname", nachname);
command.Parameters.AddWithValue("@Geburtsdatum", DateTime.Parse(geburtsdatum));
command.Parameters.AddWithValue("@Created", DateTime.Now);
command.ExecuteNonQuery();
}
}
static int GetGenderId(string anrede, MySqlConnection connection)
{
string query = "SELECT id FROM gender WHERE description = @Anrede";
using (MySqlCommand command = new MySqlCommand(query, connection))
{
command.Parameters.AddWithValue("@Anrede", anrede);
return Convert.ToInt32(command.ExecuteScalar());
}
}
static void EinfuegenInAddressTabelle(int addressId, int userId, string strasse, string plz, string stadt, MySqlConnection connection)
{
string query = "INSERT INTO address (id, userId, street, postalcode, city) " +
"VALUES (@Id, @UserId, @Strasse, @PLZ, @Stadt)";
using (MySqlCommand command = new MySqlCommand(query, connection))
{
command.Parameters.AddWithValue("@Id", addressId);
command.Parameters.AddWithValue("@UserId", userId);
command.Parameters.AddWithValue("@Strasse", strasse);
command.Parameters.AddWithValue("@PLZ", plz);
command.Parameters.AddWithValue("@Stadt", stadt);
command.ExecuteNonQuery();
}
}
static void EinfuegenInEmailTabelle(int emailId, int userId, string email, MySqlConnection connection)
{
string query = "INSERT INTO email (id, userId, email) VALUES (@Id, @UserId, @Email)";
using (MySqlCommand command = new MySqlCommand(query, connection))
{
command.Parameters.AddWithValue("@Id", emailId);
command.Parameters.AddWithValue("@UserId", userId);
command.Parameters.AddWithValue("@Email", email);
command.ExecuteNonQuery();
}
}
static void EinfuegenInPhoneTabelle(int phoneId, int userId, string phoneprefix, string phonenumber, MySqlConnection connection)
{
string query = "INSERT INTO phone (id, userId, phoneprefix, phonenumber) VALUES (@Id, @UserId, @PhonePrefix, @PhoneNumber)";
using (MySqlCommand command = new MySqlCommand(query, connection))
{
command.Parameters.AddWithValue("@Id", phoneId);
command.Parameters.AddWithValue("@UserId", userId);
command.Parameters.AddWithValue("@PhonePrefix", phoneprefix);
command.Parameters.AddWithValue("@PhoneNumber", phonenumber);
command.ExecuteNonQuery();
}
}
static bool PruefeGeburtstag(string geburtsdatum)
{
string pattern = @"^\d{2}\.\d{2}\.\d{4}$";
return Regex.IsMatch(geburtsdatum, pattern);
}
static bool PruefeEmail(string email)
{
string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
return Regex.IsMatch(email, pattern);
}
static bool PruefePLZ(string plz)
{
string pattern = @"^\d{5}$";
return Regex.IsMatch(plz, pattern);
}
static bool PruefeTelefon(string telefon)
{
string pattern = @"^\d{3,5}\s?\d{4,10}$";
return Regex.IsMatch(telefon, pattern);
}
static void ProtokolliereUngueltigeDaten(List<string> daten, string protokollPfad)
{
using (StreamWriter sw = new StreamWriter(protokollPfad, true))
{
foreach (var zeile in daten)
{
sw.WriteLine(zeile);
}
}
}
}
}