In der Firma habe ich an einigen Projekten gearbeitet und andere kleinere Aufgaben gelöst.
Leider hatte ich nichts grosses, oder etwas worüber ich hier noch nie geschrieben hätte. Deshalb schreibe ich wieder über C# da sich meine Kenntnisse in diesem Bereich stetig verbessern.
Sinn und Zweck des Auftrags:
Ich bekam den Auftrag ein Programm zu entwickeln, welches Daten aus bestimmten .csv-Files lesen, zusammenfügen und geordnet abspeichern kann. Die Files haben immer 2 Spalten. In der 1. Spalte befinden sich Zeitstempel und in der 2. Werte dazu. Mein Programm musste die Zeitstempel und Werte des "Hauptfiles" und die Werte aller im selben Ordner gespeicherten .csv-Files nehmen, zusammenfügen und abspeichern. Wo die .csv-Files liegen, welches das "Hauptfile" ist und wo und mit welchem Namen die Fertige Datei gespeichert werden soll, wird mit Hilfe von Start-Parametern mitgeteilt.
Hier sehen Sie 3 Bilder der .csv-Files. Das 1. (Value1) ist das Hauptfile, die anderen 2 befinden sich im selben Ordner.
Aus diesen 3 Files sollte nun folgendes Entstehen:
Wie man sieht haben die 3 Dateien nicht gleich viele Zeilen. Daher passen sich alle Files dem Masterfile an. Wenn eine Datei zu viele Zeilen hat, werden die überflüssigen gelöscht. Hat eine Datei zu wenig, werden in den restlichen Zeilen leere Einträge eingefügt. Auch die 1. Zeile wird vom Masterfile genommen. Allerdings sollten alle Dateien die gleichen Zeitstempel haben, ansonsten würde es keinen Sinn ergeben sie zusammenzufügen.
Ich erarbeitete mir 2 verschiedene Versionen.
Die erste entwickelte ich ohne fremde Hilfe.
Ich hatte jedoch ein Problem: Man kann nicht gleichzeitig Daten aus einem File lesen und es mit anderen Daten beschreiben. Meine Lösung las jedoch jede Datei einzeln und speicherte die gelesenen Informationen gleich Zeile für Zeile in ein .csv-File. Es gibt keine Funktion mit der ich einfach etwas ans Ende einer Zeile schreiben könnte, wie ich es gebraucht hätte, oder diese hätte ich zumindest nicht gefunden. Daher musste ich die Datei immer auslesen und gleichzeitig wieder beschreiben.
Die einzige Lösung welche mir einfiel war, die Datei nach jedem Beschrieb zu kopieren um so die Daten aus der Kopierten Datei lesen und die Originaldatei beschreiben zu können. Schlussendlich wäre die kopierte Datei gelöscht worden und alles hätte funktioniert.
Jedoch verlangsamt diesen vermehrten Dateizugriff das Programm stark und der Mitarbeiter, welcher mir den Auftrag gab war damit natürlich nicht einverstanden. Das war mir eigentlich bereits klar, jedoch viel mir keine bessere Lösung ein.
Mithilfe der Tipps des Mitarbeiters erstellte ich dann meine 2. Lösung.
Sie nutzt Listen um die Daten auszulesen und zu speichern. Zuerst wird für jede Datei eine Liste erstellt und mit den Daten abgefüllt. Anschliessend werden diese Dateien noch in einer Liste abgespeichert. So kann ich dann auf die einzelnen Einträge der Listen zugreifen und das .csv-File so beschreiben.
Code des Auftrags:
Damit man auch etwas lernt, hier noch die verwendeten Funktionen:
Der Zugriff auf die Startparameter erfolgt so:
string[] args; //damit wird args als String mit mehrere Einträgen definiert
args = Enviroment.GetCommandLineArgs(); // damit werden die Startparameter übergeben.
Die einzelnen Parameter kann ich nun mit args[1] auslesen. Die Zahl dient zur Auswahl, welchen Parameter man verwenden möchte.
Die Foreach-Schleife:
Damit ich auf jedes File im Ordner zugreifen konnte, unabhängig davon wie viele Dateien sich im Ordner befinden verwendete ich eine Foreach-Schleife. So wird sie verwendet:
DirectoryInfo variabel1 = new DirectoryInfo(Pfad); // damit weise ich der variabel1 ein Verzeichnis zu.
Mit der nächsten Zeile werden alle Befehle welche in der Foreach-Schleife vorhanden sind auf alle .csv Dateien aus dem Verzeichnis ausgeführt.
foreach (FileInfo "variabel2" in "variabel1.GetFiles("*.csv")) { Befehle; }
Das "*.csv" definiert, dass alle Dateien die am ende .csv haben in die Schlaufe genommen werden sollen. Das * steht für eine beliebige Anzahl Zeichen.
Ich erarbeitete mir 2 verschiedene Versionen.
Die erste entwickelte ich ohne fremde Hilfe.
Ich hatte jedoch ein Problem: Man kann nicht gleichzeitig Daten aus einem File lesen und es mit anderen Daten beschreiben. Meine Lösung las jedoch jede Datei einzeln und speicherte die gelesenen Informationen gleich Zeile für Zeile in ein .csv-File. Es gibt keine Funktion mit der ich einfach etwas ans Ende einer Zeile schreiben könnte, wie ich es gebraucht hätte, oder diese hätte ich zumindest nicht gefunden. Daher musste ich die Datei immer auslesen und gleichzeitig wieder beschreiben.
Die einzige Lösung welche mir einfiel war, die Datei nach jedem Beschrieb zu kopieren um so die Daten aus der Kopierten Datei lesen und die Originaldatei beschreiben zu können. Schlussendlich wäre die kopierte Datei gelöscht worden und alles hätte funktioniert.
Jedoch verlangsamt diesen vermehrten Dateizugriff das Programm stark und der Mitarbeiter, welcher mir den Auftrag gab war damit natürlich nicht einverstanden. Das war mir eigentlich bereits klar, jedoch viel mir keine bessere Lösung ein.
Mithilfe der Tipps des Mitarbeiters erstellte ich dann meine 2. Lösung.
Sie nutzt Listen um die Daten auszulesen und zu speichern. Zuerst wird für jede Datei eine Liste erstellt und mit den Daten abgefüllt. Anschliessend werden diese Dateien noch in einer Liste abgespeichert. So kann ich dann auf die einzelnen Einträge der Listen zugreifen und das .csv-File so beschreiben.
Code des Auftrags:
Damit man auch etwas lernt, hier noch die verwendeten Funktionen:
Der Zugriff auf die Startparameter erfolgt so:
string[] args; //damit wird args als String mit mehrere Einträgen definiert
args = Enviroment.GetCommandLineArgs(); // damit werden die Startparameter übergeben.
Die einzelnen Parameter kann ich nun mit args[1] auslesen. Die Zahl dient zur Auswahl, welchen Parameter man verwenden möchte.
Die Foreach-Schleife:
Damit ich auf jedes File im Ordner zugreifen konnte, unabhängig davon wie viele Dateien sich im Ordner befinden verwendete ich eine Foreach-Schleife. So wird sie verwendet:
DirectoryInfo variabel1 = new DirectoryInfo(Pfad); // damit weise ich der variabel1 ein Verzeichnis zu.
Mit der nächsten Zeile werden alle Befehle welche in der Foreach-Schleife vorhanden sind auf alle .csv Dateien aus dem Verzeichnis ausgeführt.
foreach (FileInfo "variabel2" in "variabel1.GetFiles("*.csv")) { Befehle; }
Das "*.csv" definiert, dass alle Dateien die am ende .csv haben in die Schlaufe genommen werden sollen. Das * steht für eine beliebige Anzahl Zeichen.
Die Split-Funktion:
Damit ich Strings in mehrere kleinere Teile unterteilen kann gibt es die Split-Funktion. Sie funktioniert Folgendermassen:
Man muss eine Variabel, hier variabel1, aufteilen. Wo genau diese aufgeteilt wird, kann man mit dem Parameter, hier ':', übergeben. Dann muss man das ganze einer anderen Variabel zuweisen, hier variabel2:
variabel2 = variabel1.Split(':');
Die Variabel1 wird hier bei allen : aufgeteilt. Wäre in variabel1 also folgender Satz gespeichert gewesen: "Hier ist die Lösung:2" wäre in Variabel2 nun folgendes gespeichert:
variabel2[0] = Hier ist die Lösung
variabel2[1] = 2
Zu beachten ist hier noch, dass die variabel2 folgendermassen deklariert werden muss:
string[] variabel2; // So kann ich wie beim Args mehrere Einträge definieren.
variabel2 = variabel1.Split(':');
Die Variabel1 wird hier bei allen : aufgeteilt. Wäre in variabel1 also folgender Satz gespeichert gewesen: "Hier ist die Lösung:2" wäre in Variabel2 nun folgendes gespeichert:
variabel2[0] = Hier ist die Lösung
variabel2[1] = 2
Zu beachten ist hier noch, dass die variabel2 folgendermassen deklariert werden muss:
string[] variabel2; // So kann ich wie beim Args mehrere Einträge definieren.
Keine Kommentare:
Kommentar veröffentlichen