Tician

Mitglieder
  • Gesamte Inhalte

    203
  • Benutzer seit

  • Letzter Besuch

  • Tagessiege

    2

Tician hat zuletzt am 16. September 2016 gewonnen

Tician hat die beliebtesten Inhalte erstellt!

1 Benutzer folgt diesem Benutzer

Über Tician

  • Rang
    Advanced Member
  • Geburtstag 16.11.1990

Profile Information

  • Ort
    127.0.0.1
  1. Also das Programm funktioniert wieder und soweit war ich mit meiner Idee gar nicht weg *freu* Da sollen noch ein paar Dinge dazu kommen, aber die würde ich später hinzufügen wenn das Programm so wie es ist mal an die durchschnittlichen Ansprüchen der OOP ran kommt. Stand der Dinge: class Program { static void Main(string[] args) { try { SettingsLoader loader = new SettingsLoader(); Settings settings1 = loader.Load("settings.ini"); CsvChanger changer = new CsvChanger(); changer.FindCsv(settings1.source); changer.ReadCsv(); changer.ChangeCsv(); changer.WriteFiles(settings1.destination); Console.ReadKey(); } catch { Console.WriteLine("Unknown error"); } } } class Settings { public string iniText; public string source { get; set; } public string destination { get; set; } } class SettingsLoader { string filename; string iniText; public Settings Load(string filename) { this.filename = filename; iniText = File.ReadAllText(filename); Regex rsource = new Regex("(?<=Source\\=).+"); Match msource = rsource.Match(iniText); Regex rdestination = new Regex("(?<=Destination\\=).+"); Match mdestination = rdestination.Match(iniText); return new Settings { source = Convert.ToString(msource).Replace("\r", ""), destination = Convert.ToString(mdestination).Replace("\r", ""), iniText = iniText }; } } class CsvChanger { private string[] changedContent; private int fileCount; private string[] files; private string[] fileContent; //Settings settings2 = new Settings(); string source; string destination; public void FindCsv(string source) { try { this.source = source; files = Directory.GetFiles(source, "GAR_EXPORT_*.csv"); fileCount = files.Length; if (fileCount == 0) { Console.WriteLine("Keine Dateien gefunden. Bitte Taste drücken..."); Console.ReadKey(); Environment.Exit(0); } Console.WriteLine("{0} Dateien gefunden!", fileCount); } catch { Console.WriteLine("Error finding files"); } } public void ReadCsv() { try { fileContent = new string[fileCount]; for (int x = 0; x < fileCount; x++) { fileContent[x] = File.ReadAllText(files[x]); } Console.WriteLine("Dateien erfolgreich eingelesen!"); } catch { Console.WriteLine("Couldn't read CSV"); } } public void ChangeCsv() { try { changedContent = new string[fileCount]; for (int x = 0; x < fileCount; x++) { changedContent[x] = fileContent[x].Replace("\"", ""); } Console.WriteLine("Anführungszeichen erfolgreich ersetzt!"); } catch { Console.WriteLine("Couldn't replace file-content"); } } public void WriteFiles(string destination) { try { this.destination = destination; for (int x = 0; x < fileCount; x++) { using (StreamWriter sw = new StreamWriter(destination + Path.GetFileName(files[x]))) { sw.Write(changedContent[x]); } } Console.WriteLine("Dateien in Ziel-Pfad geschrieben! \n Fertig :)"); } catch { Console.WriteLine("Error writing files to destination"); } } } @GottlikeDen Link kenne ich schon (immerhin besser als der vorherige für Delphi :P) und bis auf die Überladungen (bzw wie man die schreiben kann) kenne ich alles schon. Allgemein das mit der Rückgabe habe ich zwar in diesem Thread erst verstanden, aber das dann statt den mir bekannten Datentypen (int, byte, string,...) plötzlich mit einer Klasse hat mich verwirrt, aber auch das habe ich denke ich jetzt verstanden.
  2. Also gut, wie gesagt ich habe keine Ahnung wie man das benutzt und habe mal sämtliche Errors und Warnungen ignoriert und es so hingebastelt wie ich dachte das es (so oder so ähnlich) funktionieren würde: class Program { static void Main(string[] args) { SettingsLoader loader = new SettingsLoader(); Settings settings1 = loader.Load("settings.ini"); } } class Settings { private string iniText; public string source { get; set; } public string destination { get; set; } } class SettingsLoader { string filename; string iniText; public Settings Load(string filename) { this.filename = filename; iniText = File.ReadAllText(filename); Regex rsource = new Regex("(?<=Source\\=).+"); Match msource = rsource.Match(iniText); Regex rdestination = new Regex("(?<=Destination\\=).+"); Match mdestination = rdestination.Match(iniText); return Convert.ToString(mdestination).Replace("\r", ""); return Convert.ToString(msource).Replace("\r", ""); return iniText; } } Das Hauptproblem ist das ich null Ahnung von der Rückgabe habe, das ich nicht mehrmals "return" haben kann ist mir klar, das soll auch mehr symbolisch zeigen was ich eigentlich machen möchte, ich brauche schließlich 3 Variablen brauche. Außerdem sind meine getter und setter so irgendwie nutzlos... sorry ich blicks nicht ._.
  3. Das Seltsame an den Regex ist das ich das bisher immer benutzt habe und auch immer mit mehreren Zeilen in der ini-Datei und nie hatte ich dieses '\r' beim konvertieren mit drin. @Whiz-zarD Könnte ich ein kurzes Beispiel haben was Datenstruktur und was Logik ist? Ist Datenstruktur alles was ich deklariere, während Logik die Ausführung von Vorgängen ist? public class SettingsLoader { public Settings Load(string fileName) { ... } } Das habe ich noch nie gesehen, ich weiß gar nicht was es macht. Wie nennt sich das, nach was kann ich schauen? Kann man das ohne Fachbegriffe beschreiben oder gibt es eine andere Schreibweise wie man das schreiben könnte um es zu verstehen (wie get und set auszuschreiben)? Ich kenne bisher nur Klassen mit eigenen Methoden (mit oder ohne Rückgabe eines mir bekannten Datentyps) und den Konstruktor. Und das ich Variablen über die Klammern in die Methode einer anderen Klasse 'übergeben' kann. Als Rückgabewert eine Klasse zu haben ist mir neu und verwirrt mich gerade etwas, ich versuche ein Beispiel zu finden um es zu verstehen aber irgendwie ist das recht schwierig.
  4. Gecheckt! So hatte ich es ja auch als allererstes aus irgendeinem Grund dachte ich ich müsste es ändern...
  5. @Gottlike Ich denke du kannst mir nochmal helfen: Main: Settings settings1 = new Settings(); source = settings1.GetSource(); destination = settings1.GetDestination(); Beim Zeilenweisen durchgehen rufe ich GetSource() sowohl im Konstruktor als auch noch einmal über die Methode selbst auf. Es wird also 2 mal durchlaufen. Ist das Sinn der Sache und normal? Oder kann man das so hinbasteln das GetSource() nur ein einziges mal durchläuft und ich die Variable in meiner Program class zur verfügung habe?
  6. Immerhin das sagt mir ich bewege mich in die richtige Richtung, das freut mich
  7. Also gut^^ Ich musste jetzt auch das ReadFile() in den Konstruktor nehmen sonst funktionieren die Getter nicht weil die ini-Datei fehlt. Neuer Code sieht so aus: class Program { static void Main(string[] args) { string source; string destination; try { Settings settings1 = new Settings(); source = settings1.GetSource(); destination = settings1.GetDestination(); CsvChanger changer = new CsvChanger(); changer.FindCsv(source); changer.ReadCsv(); changer.ChangeCsv(); changer.WriteFiles(destination); Console.ReadKey(); } catch { Console.WriteLine("Unknown error"); } } } class Settings { private string iniText; public string source { get; set; } public string destination { get; set; } public Settings() { ReadFile("settings.ini"); this.source = GetSource(); this.destination = GetDestination(); } public void ReadFile(string iniFile) { try { iniText = File.ReadAllText(iniFile); } catch { Console.WriteLine("settings.ini not found"); } } public string GetSource() { try { Regex rsource = new Regex("(?<=Source\\=).+"); Match msource = rsource.Match(iniText); return Convert.ToString(msource); } catch { Console.WriteLine("Could not find 'Source' in settings"); return ""; } } public string GetDestination() { try { Regex rdestination = new Regex("(?<=Destination\\=).+"); Match mdestination = rdestination.Match(iniText); return Convert.ToString(mdestination); } catch { Console.WriteLine("Could not find 'Destination' in settings"); return ""; } } } class CsvChanger { private string[] changedContent; private int fileCount; private string[] files; private string[] fileContent; string source; string destination; public void FindCsv(string source) { try { this.source = source; files = Directory.GetFiles(source, "GAR_EXPORT_*.csv"); fileCount = files.Length; if (files == null) { Environment.Exit(0); } } catch (Exception ex) { Console.WriteLine("Error finding files"); Console.WriteLine(Convert.ToString(ex)); } } public void ReadCsv() { try { for (int x = 1; x <= fileCount; x++) { fileContent[x] = File.ReadAllText(files[x]); } } catch { Console.WriteLine("Couldn't read CSV"); } } public void ChangeCsv() { try { for (int x = 1; x <= fileCount; x++) { changedContent[x] = fileContent[x].Replace("\"", ""); } } catch { Console.WriteLine("Couldn't replace file-content"); } } public void WriteFiles(string destination) { try { this.destination = destination; for (int x = 1; x <= fileCount; x++) { using (StreamWriter sw = new StreamWriter(destination + Path.GetFileName(files[x]))) { sw.Write(changedContent[x]); } } } catch { Console.WriteLine("Error writing files to destination"); } } } Das Problem mit dem '\r' beim konvertieren zu einem string bleibt :/
  8. Apropo Exception handling. Da ich alles in meiner Main aufrufe, könnte ich nicht alle Exceptions weglassen bis auf das hier? class Program { static void Main(string[] args) { string source; string destination; try { Settings settings1 = new Settings(); settings1.ReadFile("settings.ini"); source = settings1.GetSource(); destination = settings1.GetDestination(); CsvChanger changer = new CsvChanger(); changer.FindCsv(source); changer.ReadCsv(); changer.ChangeCsv(); changer.WriteFiles(destination); Console.ReadKey(); } catch { Console.WriteLine("Unknown error"); } } } Oder gilt das nicht?
  9. public string GetSource() { try { Regex rsource = new Regex("(?<=Source\\=).+"); Match msource = rsource.Match(iniText); return Convert.ToString(msource); } catch { Console.WriteLine("Could not find 'Source' in settings"); } } Ich hatte es ähnlich versucht und kam auf dasselbe Ergebnis: "Settings.GetSource(): nicht alle Codepfade geben einen Wert zurück" Deswegen bin ich auch verwirrt.
  10. Verstehe ich das richtig, ich muss um die Source aus der ini-Datei zu bekommen eine Methode machen und brauche für die Rückgabe nochmal eine Methode? Ne die Variable müsste über get und set ja schon selbst etwas haben... ich bin verwirrt. Wie setze ich denn die source-variable nachdem ich die ini-Datei ausgelesen habe?
  11. Moinsen, auch wenn es noch nicht funktioniert stelle ich mal meinen ersten vollständigen Versuch zur OOP vor. Nach wie vor hoffe ich das ich nicht meilenweit am Ziel vorbei geschossen bin. Das Programm soll bestimmte csv-Dateien aus einem (in einer ini-Datei) festgelegten Pfad auslesen, die Anführungszeichen in den Dateien löschen und sie wieder in einem anderen Pfad speichern. Ich hoffe das sollte für den Anfang vom Schwierigkeitsgrad her einfach genug sein. Mein Ziel ist mich der OOP Schrittweise zu nähern, daher bitte ich euch keine komplette Überarbeitung zu posten. Ich versuche - sofern mir möglich - die Vorschläge nacheinander umzusetzen und natürlich zu verstehen. Ich habe 3 Klassen: Program (Main); Settings (um die 2 Zeilen in der ini-Datei auszulesen); CsvChanger (suchen, lesen, verändern und schreiben der Dateien) Der Code: class Program { static void Main(string[] args) { try { Settings settings1 = new Settings(); settings1.ReadFile("settings.ini"); settings1.GetSource(); settings1.GetDestination(); CsvChanger changer = new CsvChanger(); changer.FindCsv(settings1.source); changer.ReadCsv(); changer.ChangeCsv(); changer.WriteFiles(settings1.destination); Console.ReadKey(); } catch { Console.WriteLine("Unknown error"); } } } class Settings { private string iniText; public string source { get; set; } public string destination { get; set; } public void ReadFile(string iniFile) { try { iniText = File.ReadAllText(iniFile); } catch { Console.WriteLine("settings.ini not found"); } } public void GetSource() { try { Regex rsource = new Regex("(?<=Source\\=).+"); Match msource = rsource.Match(iniText); source = Convert.ToString(msource); } catch { Console.WriteLine("Could not find 'Source' in settings"); } } public void GetDestination() { try { Regex rdestination = new Regex("(?<=Destination\\=).+"); Match mdestination = rdestination.Match(iniText); destination = Convert.ToString(mdestination); } catch { Console.WriteLine("Could not find 'Destination' in settings"); } } } class CsvChanger { private string[] changedContent; private int fileCount; private string[] files; private string[] fileContent; //Settings settings2 = new Settings(); string source; string destination; public void FindCsv(string source) { try { this.source = source; files = Directory.GetFiles(source, "GAR_EXPORT_*.csv"); fileCount = files.Length; if (files == null) { Environment.Exit(0); } } catch (Exception ex) { Console.WriteLine("Error finding files"); Console.WriteLine(Convert.ToString(ex)); } } public void ReadCsv() { try { for (int x = 1; x <= fileCount; x++) { fileContent[x] = File.ReadAllText(files[x]); } } catch { Console.WriteLine("Couldn't read CSV"); } } public void ChangeCsv() { try { for (int x = 1; x <= fileCount; x++) { changedContent[x] = fileContent[x].Replace("\"", ""); } } catch { Console.WriteLine("Couldn't replace file-content"); } } public void WriteFiles(string destination) { try { this.destination = destination; for (int x = 1; x <= fileCount; x++) { using (StreamWriter sw = new StreamWriter(destination + Path.GetFileName(files[x]))) { sw.Write(changedContent[x]); } } } catch { Console.WriteLine("Error writing files to destination"); } } } Einen Vorschlag hatte ich schon bekommen: Die Get-Methoden haben kein return, allerdings sind sie trotzdem dafür da etwas auszulesen und in eine Variable zu speichern. Ich weiß nicht wie ich das sonst nennen soll^^ Warum das Programm nicht funktioniert: try { Regex rsource = new Regex("(?<=Source\\=).+"); Match msource = rsource.Match(iniText); source = Convert.ToString(msource); } Ich mache nichts anders als sonst auch aber folgendes passiert: msource hat genau das was ich möchte, in der Überwachung sieht es so aus: msource = "C:\\Users\\ich\\desktop\\" allerdings sobald ich in einen string convertiere sieht source dann so aus: source = "C:\\Users\\ich\\desktop\\\r" und ich bekomme die Meldung "ungültige Zeichen in Pfad" als Exception. Ich habe keine Ahnung wo dieses '\r' her kommt und warum es in all meinen vorherigen Programmen in denen ich Regex zum ini-Datei auslesen benutzt habe einwandfrei funktioniert hat. Hat da jemand eine Idee?
  12. Mein Lehrer konnte mein Problem identifizieren. Ich hab in meiner Klasse C ein neues Objekt der Klasse B angelegt und das kannte natürlich das "source" nicht mehr das ich in Klasse A zugewiesen habe. Mein Spaghetti-Code-Programm muss heute fertig werden, danach kann ich mich wieder um das neue Projekt mit der OOP kümmern.
  13. Ich hab morgen Berufssschule, ich bezweifel das ich da zu etwas komme, ich versuch es am Freitag nochmal etwas genauer zu posten.
  14. Ich dachte ich hätte es verstanden... irgendwie nicht Wenn ich folgendes habe: class A (Main) { B.GetSource C.DoSomething } class B { public string source {get;set;} public void GetSource { //blabla source = //blabla } } class C { public void DoSomething { string file = Directory.GetFiles(B.source, "*.csv"); } } Ich dachte das würde so funktionieren, aber ich bekomme nur ein "ArgumentNullException" das sich auf "source" bezieht. Wenn ich Schritt für Schritt durchgehe bekommt source einen Wert, aber sobald es zu Class C kommt ist der nicht mehr vorhanden. Was mache ich falsch?
  15. Also ich hab wieder ein neues Projekt aber das werde ich erst für Verbesserungsvorschläge freigeben wenn es fertig ist Jetzt habe ich gerade aber eine Frage: Wann benutze ich das: Class B { A.Nummer = 15; A.TuEtwas(); } Class A { int Nummer {get;set;} public void TuEtwas() { //mach etwas mit Nummer } und wann das: Class B { int nummer = 15; A.TuEtwas(nummer) } Class A { //int nummer; public void TuEtwas(int nummer) { this.nummer = nummer; //Tu etwas mit nummer } } Beides schiebt - sofern ich das verstanden habe - den Inhalt einer Variable von einer Klasse in die andere. Bei ersterem einfach nur rein die Variable und bei zweiterem zur direkten Verwendung in einer Methode. Kann ich also sagen wenn ich eine Variable in mehreren Methoden brauche dann benutze ich ersteres und wenn ich es nur für eine methode brauche zweiteres?