Autor Beitrag
Bit
Hält's aus hier
Beiträge: 1



BeitragVerfasst: So 03.01.16 21:47 
Hallo zusammen,
ich bin ganz neu in der C# Welt, und auch kein Programmierer. Allerdings habe ich eine echte Anforderung zu lösen und da kommen schon einige Probleme und Fragen auf. Zur Anwendung:
Ich muss aus einem Text File Daten auslesen. Das mache ich mit: File.ReadAllLines()Dieses Daten File ist ein Log File. Die erste Zeile soll ein String bleiben, da hier alle geloggten Labels vorkommen. Die Werte sind alle mit einem Semikolon getrennt. Ich Splitte die Strings mit: .Split(new Char[] { }); Die so erhaltenen Werte speichere ich dann in einem zweidimensionalen Array ab, und wandle sie in Werte vom Typ Double um, um damit rechnen zu können.
Der nächste Schritt ist identisch, lediglich die Länge der Arrays ändert sich. Hier muss ein „Map File“ eingelesen werden. X- Achse ist die Drehzahl, Y Achse ist die TH Position.
Im nächsten Schritt werden gültige Werte ermittelt. Das ist also ein Filter. Ich möchte Werte aus dem Logfile filtern, die möglichst nahe an die Punkte im Map file ran kommen. Z.B wird als 2ter Wert im Logfile die Drehzahl mit geloggt. Das Map File hat in X Richtung die Werte der Drehzahl von z.B 0, 1000, 1500, 2000 etc. Also lese ich den Wert des Logfile Arrays[2,1-n(0 ist der Label Name und somit nicht als Double vorhanden)] und vergleiche ihn mit dem Wert im Mapfile Array [0,0-n]. Wenn es ein Match gibt, zähle ich einen Zähler hoch. Es gibt noch einen identischen Filter, doch hier wird der Y- Wert aus dem Mapfile als Vergleichsgröße genommen. Auch hier wird bei einem Match ein Zähler hoch gezählt. Bei 3 aufeinanderfolgenden Matches bei BEIDEN Filtern soll der Punkt gültig sein und die Werte in einem weiteren Array an derselben Position gespeichert werden wo sie auch im Logfile waren. Bei einem Durchgang ergibt sich somit dann ein Array mit gleicher Größe wie das Logdaten Array, doch sind hier überall wo „ungültige“ Punkte waren der Wert 0. Das Einlesen, und Speichern funktioniert, auch der Filter so irgendwie…
und da ist mein Problem. Ab wann ein Match in dem jeweiligen Filter ausgelöst werden soll, soll durch eine Hysterese eingestellt werden. Z.B +/-5% Drehzahl (1.Filter) und +/- 1% TH (2.Filter). Bei 0% muss der Wert genau getroffen werden, bei 100 % ist beinahe jeder Wert ein Match etc. In meinem Programm, wenn ich die Filter einzeln ausführen lasse, ist die Menge der Matches wie zu erwarten, bei 0 % wenig und stetig steigend je höher ich die Hysterese mache. Wenn ich aber beide Filter im Programm habe und dann einen Filter verändere habe ich z.B folgendes Verhalten: 0%  1 Match, 1%  6 Matches, 2%  16 Matches, 3%  56 Matches, 4%  23 Matches. Also die Menge der Matches steigt an und wird aber irgendwann wieder weniger. Eigentlich dürfte die Menge mit höherer Hysterese niemals weniger als vorher haben, minimal so viel wie vorher… ich verstehs nicht. Vielleicht kann mir jemand von euch helfen, oder hat allgemeine Tipps wie ich einen Filter( oder das ganze Programm ;) besser machen kann.
Allgemeine Frage: Ich habe jetzt alle Methoden in eine Klasse gemacht, würde aber gerne z.B eine Klasse für das MapFile einlesen, eine für das LogFile einlesen eine für den Filter etc… machen, aber wie bekomme ich dann die Werte der z.B ReadLogfile Methode in die anderen Klassen, wenn ich nur jeweils ein return Wert zurückgeben kann ? Ich habe so ein Konstrukt versucht:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
public FileHandling Test()
{
    FileHandling x = new FileHandling();
           
    return x;
}

um so auf alle Werte von FileHandling zugreifen zu können. Allerdings funzt das nicht. Auch ein Punkt ist die Verfügbarkeit von Variablen innerhalb einer Klasse… die sind nicht automatisch jeder Methode in der gleichen Klasse bekannt, wie kann ich sowas machen? Mit public xy..habe ich manchmal das Problem, dass die Variablen dann in z.B einer For schleife nicht bekannt sind …
Ein weiterer Punkt ist die Performance… es sind 300000 Zeilen auszulesen, zu speichern, vergleichen und dann nochmal neu zu berechnen. Momentan geht’s eigentlich gar nicht mal langsam aber ich muss ja dann noch aus dem gültigen Logfile Punkten eine neue Map berechnen. Also alles was Speed  bringt, ist gut.
Der nächste Schritt ist aus den gültigen Punkten für alle nicht vorhanden Punkten eine Interpolation vorzunehmen, vielleicht gibt’s da schon was und ich muss das Rad nicht neu erfinden… Also ich als N00b bin für jeden Tipp, jede Anmerkung und für konstruktive Kritik dankbar. Ich habe aus dem Bin Ordner die exe Dateien entfernt und mein Programm gezippt. Gruß Bit

Moderiert von user profile iconNarses: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Topic aus WinForms verschoben am Mo 04.01.2016 um 11:18
Moderiert von user profile iconTh69: Titel geändert (war "Hilfe für Anfänger").
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 05.01.16 13:27 
Hallo und :welcome:

ich habe gerade gesehen, daß du auch einen Beitrag im myCSharp-Forum dazu erstellt hast: Werte aus Text File Filtern

Ich hatte zwar gestern deinen Beitrag gesehen, aber wegen des (zu) umfangreichen Textes nicht gelesen.
Anhand des anderen Beitrags verstehe ich aber nun dein Problem mit deiner Test-Methode. ;-)
Da diese Methode Teil der Klasse FileHandling selbst ist (und nicht Teil deiner aufrufenden Klasse) müßtest du zuerst ein Objekt der Klasse FileHandling selbst erzeugen, um die Methode aufrufen zu können (wie bei jeder anderen Methode auch):
ausblenden C#-Quelltext
1:
2:
3:
4:
FileHandling fileHandling = new FileHandling();
           
FileHandling fh = fileHandling.Test();
fh.Read_Log_File();

Daran sieht man jetzt auch, daß dies ziemlich unsinnig ist.

Also einfach in deiner aufrufenden Klasse (z.B. in der Main-Methode) den Code verwenden (und die Test-Methode entfernen):
ausblenden C#-Quelltext
1:
2:
3:
FileHandling fileHandling = new FileHandling();
           
filehandling.Read_Log_File();

Zu deinem Performance-Problem kann ich jedoch wenig zu sagen, da verwende am besten einen Profiler (z.B. den von der (kostenlosen) "VS 2015 Community Edition", s. z.B. Profiling tests in Visual Studio Community 2015)