Autor Beitrag
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Sa 16.01.16 23:11 
user profile iconmkRE hat folgendes geschrieben Zum zitierten Posting springen:
Wird mit listen z.B. eine TextDatei gemeint?


Nein damit ist ein Klasse mit einer generischen Liste gemeint.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
[Serializable]
public class Measurement
{
    public Measurement()
    {
    ListOfPoints = new List<PointValues>();
    }

    public string Name { get; set; }
    public DateTime Measurementdate { get; set; }

    public List<PointValues> ListOfPoints { get; set; }
}

[Serializable]
public class PointValues
{
    /// <summary>
    /// Time
    /// </summary>
    public int X { get; set; }
    /// <summary>
    /// Amplitude
    /// </summary>
    public int Y { get; set; }
}



Serialisieren kann man das dann so:

Klasse die die De-/Serialisierung übernimmt.
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
public class MySerializer
{
    public static void Serialize(object myClass, string directory, string file)
    {
        if (!Directory.Exists(directory))
            Directory.CreateDirectory(directory);

        string fileabs = Path.Combine(directory, file);

        using (FileStream myFileStream = new FileStream(fileabs, FileMode.Create))
        {
            BinaryFormatter binFormatter = new BinaryFormatter();
            binFormatter.Serialize(myFileStream, myClass);
        }
    }

    public static object Deserialize(string file)
    {
        object oldObject = null;

        if (File.Exists(file))
        {
            using (FileStream myFileStream = new FileStream(file, FileMode.Open))
            {
                BinaryFormatter binFormatter = new BinaryFormatter();
                oldObject = binFormatter.Deserialize(myFileStream) as object;
            }
        }
        return oldObject;
    }
}



Speichern /laden:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
private void LoadSave()
{
    //Messung starten
    //================
    Measurement m = new Measurement() { Name = "Messung1", Measurementdate = DateTime.Now };

    for(int i = 0; i < 100; i++)
    {
        m.ListOfPoints.Add(new PointValues() { X = i, Y = i });
    }
    //================
    
    //Wegschreiben
    MySerializer.Serialize(m, @"c:\Test""Messung1.mes");

    //Wieder einlesen
    var oldMes = MySerializer.Deserialize(System.IO.Path.Combine(@"c:\Test""Messung1.mes"));
}


Alternativ gibt es auch einen XML Serializer.


user profile iconmkRE hat folgendes geschrieben Zum zitierten Posting springen:
Was wird genau mit auf Platte schreiben gemeint und welche Datei kann ich mir da vorstellen?


Damit ist gemeint, das man jeden oder jeden n Messpunkt gleich auf die Festplatte wegschreibt. Stellt sich nur die Frage, ob man mit einer unterbrochenen Messung was anfangen kann, oder wartet man mit dem speichern bis zum Ende vom Lauf? Das kannst nur Du wissen....


Für den Anfang kannst Du aber auch ruhig eine Tabelle verwenden, wenn dir das leichter fällt. Das wird auch sehr gut laufen. Ich verdiene mein Geld mit messen und spreche da aus Erfahrung :-) Aber mein Vorschlag ist auch nicht so schwer, oder?

_________________
Gruß
Christoph
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Sa 16.01.16 23:20 
Bitte nimm keine DataTable (Sorry Christoph :D)
Ja, es ist einfach und Du kannst im Prinzip alles rein werfen, aber das ist auch der größte Nachteil.
Du kannst alles rein werfen, wie das am Ende aus sieht und ob das, was Du rein wirfst, aich so richtig ist, erfärst Du erst irgendwann zur Laufzeit.

Besser wäre sowas:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
public class Measurement
{
    public int Size { get; set; }
    public DateTime Timestamp { get; set; }

    // Weitere Eigenschaften:
    // public int MyProperty { get; set; }
}


Und die (beispielhafte) Nutzung:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var measurements = new List<Measurement>();

// So lange neue Einträge der Liste hinzufügen, wie gemessen wird
while (Measuring)
{
    var measurement = new Measurement();

    measurement.Size = GetSize();
    measurement.Timestamp = DateTime.Now;

    // Weitere Eigenschaften:
    // measurement.MyProperty = GetMyProperty();

    measurements.Add(measurement);
}

Serialize(measurements);


Da hast Du eine feste Struktur (Die Klasse Measurement) und der Compiler sagt dir, was nicht passt.
Das Speichern muss aber ohne bereits implementierte Read- und Write-Methode nicht kompliziert sein.
Der XmlSerializer macht das fast genauso einfach. Das "fast", weil das erst einmal implementiert werden muss:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
public static void Serialize<T>(string xmlFile, T obj)
{
    var serializer = new XmlSerializer(typeof(T));

    // Erstellt einen neuen Datei-Stream, über den Du auf die Datei zugreifen kannst.
    // Das 'using' sorgt dafür, dass der Stream immer - auch bei einer Exception - geschlossen wird, sonst bleibt die Datei länger gesperrt als gewünscht
    using (var fileStream = File.Create(xmlFile))
    {
        // Das Objekt in die Datei serialisieren
        serializer.Serialize(file, obj);
    }
}
public static T Deserialize<T>(string xmlFile)
{
    var serializer = new XmlSerializer(typeof(T));

    using (var fileStream = File.OpenRead(xmlFile))
    {
        // Die Datei auslesen und die Daten deserialisieren
        return (T)serializer.Deserialize(file);
    }
}


Diese Methoden irgendwo hin legen und aufrufen.
Solange die Objekte serialisierbar sind, ist damit Lesen und Speichern geklärt.
Und keine Sorge: Die Meispielklasse oben ist serialisierbar, solange die Properties öffentlich gelesen und geschrieben werden können und ein public Konstruktor ohne Parameter existiert.
Sowas wie ein Dictionary nicht, allerdings gibt es online ohne Ende Beispiele, wie man das nachliefern kann.

Das hat den Vorteil, dass es sehr einfach ist und Du hast nicht die Nachteile einer DataTable.
Ist es aber unbedingt von Bedeutung, dass im schlimmsten Fall zumindest ein Teil der Messwerte erhalten bleiben, dann hast Du da ein Problem.
So kann ich mir z.B. vorstellen, dass eine sehr lang andauernde Messung irgendwann einen Fehler hat und Du die komplette Messung neu starten musst, da die Ergebnisse erst nach der Messung gespeichert werden.

Ob das von Bedeutung ist, das musst Du wissen.
Wenn es von Bedeutung ist, dann musst Du selber manuell schreiben und dir ein eigenes Vormat (z.B. durch Trennzeichen getrennt) ausdenken.


Zitat:
Wird mit listen z.B. eine TextDatei gemeint?


Damit meine ich eine Liste, in der ein Objekt pro Mess-Ergebnis rein kommt.
In meinem Beispiel oben wäre die Variable 'measurements' diese Liste.

Zitat:
Was wird genau mit auf Platte schreiben gemeint und welche Datei kann ich mir da vorstellen?


Damit meine ich den Vorgang, in dem eine Zeile in irgendeine Datei geschrieben wird.
Jede bereits ausprogrammierte Art, etwas in eine Datei zu speichern, wird früher oder später an dem Punkt angelangt sein, dass es einen Text in eine Datei schreiben.
Das heißt dann, es teilt dem Windows mit, es soll doch mal bitte den angegebenen Text in eine Datei schreiben und Windows sorgt dann dafür, dass dieser Text möglichst bald in die Datei - also auf die Festplatte - geschrieben wird.



PS:

Nun war ich doch ein bisschen zu langsam :D

Da ich aber gerade das lese:

Zitat:
Ja es sollte möglich sein auch ohne meiner Anwendung die Messwerte zu sehen ( z.b. Excel).


Dann fällt XML, binäres serialisieren (was Christoph zeigt), oder ähnliches raus.
Du könntest z.B. CSV nehmen, Excel kann das darstellen und es gibt online mehrere Möglichkeiten zu finden, die CSV schreiben oder Lesen können.
Oder Du schreibst das CSV selber, am Ende sind das ja nur durch Semikolon getrennte Werte.
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: So 17.01.16 09:47 
Guten Morgen :-)

Also, wenn XML und Binary wegfallen, dann würde ich statt csv doch lieber die XML Variante vom DataTable nehmen. Beides ich ist untypisiert, beide Formate können mit Excel geöffnet werden. XML kann man sich zudem mit einem Internet Browser anschauen. Die CSV Reader die ich bisher verwendet habe, haben auch immer nur eine Tabelle ausgegeben.(Gut möglich das es mittlerweile neue im Netz gibt??) Bei der Variante mit DataTable fällt zudem das String-Gefrickel weg. CSV finde ich irgend wie Altbacken, das gibt es schon seit 1967 :-)

_________________
Gruß
Christoph
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 17.01.16 13:27 
Stimmt schon, dass CSV altbacken ist, aber es ist einfach und funktioniert überall.
Aber wie kann Excel XML anzeigen? So auf die Schnelle habe ich keine einfache Lösung gefunden, nur dass man ein Zuordnungsschema erstellen muss.

Ich persönlich finde CSV immer noch am besten geeignet. In Excel kann es sofort ohne Anpassungen geöffnet werden und ist kinderleicht zu schreiben.
Kurzes Googlen hat diese CSV-Library ergeben.

Ein kleines Beispiel:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
public class Measurement
{
    public int Size { get; set; }
    public DateTime Timestamp { get; set; }
    // Weitere Eigenschaften:
    // ...
}

// Das soll die Quelle der Messungen simulieren:
public static class MeasurementSource
{
    private static readonly Random _rnd = new Random();

    public static int GetNextSize()
    {
        return _rnd.Next(01000);
    }

    // Weitere Werte:
    // ...
}

class Program
{
    static void Main(string[] args)
    {
        using (var csvFile = new CsvFile<Measurement>("measurements.csv"))
        {
            // Nur 10 Messungen, weil ich nicht so lange warten sollte :D
            for (int i = 0; i < 10; i++)
            {
                // Zwei Messungen pro Sekunde:
                Thread.Sleep(500);

                var measurement = new Measurement()
                {
                    Size = MeasurementSource.GetNextSize(),
                    Timestamp = DateTime.Now,
                    // Weitere Eigenschaften:
                    // ...
                };

                csvFile.Append(measurement);
            }
        }
    }
}


Das Ergebnis in CSV:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Size;Timestamp
571;17.01.2016 12:17:59
159;17.01.2016 12:17:59
713;17.01.2016 12:18:00
872;17.01.2016 12:18:00
517;17.01.2016 12:18:01
135;17.01.2016 12:18:01
870;17.01.2016 12:18:02
761;17.01.2016 12:18:02
200;17.01.2016 12:18:03
591;17.01.2016 12:18:03


In Excel lässt sich das problemlos öffnen, zumindest bei mir ist Excel als Standart-Programm für CSV eingestellt und ich dann es direkt mit Doppelklick öffnen.



Und das Lesen im Programm:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
using (var measurements = new CsvFileReader<Measurement>("measurements.csv"))
{
    foreach (var measurement in measurements)
    {
        Console.WriteLine("Size: " + measurement.Size);
        Console.WriteLine("Timestamp: " + measurement.Timestamp);
        Console.WriteLine("==============================");
    }
}

Console.ReadKey();



Das sieht dann so aus:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
Size: 571
Timestamp: 17.01.2016 12:17:59
==============================
Size: 159
Timestamp: 17.01.2016 12:17:59
==============================
Size: 713
Timestamp: 17.01.2016 12:18:00
==============================
Size: 872
Timestamp: 17.01.2016 12:18:00
==============================
Size: 517
Timestamp: 17.01.2016 12:18:01
==============================
Size: 135
Timestamp: 17.01.2016 12:18:01
==============================
Size: 870
Timestamp: 17.01.2016 12:18:02
==============================
Size: 761
Timestamp: 17.01.2016 12:18:02
==============================
Size: 200
Timestamp: 17.01.2016 12:18:03
==============================
Size: 591
Timestamp: 17.01.2016 12:18:03
==============================



PS:
Das Ding ist wirklich schnell.
Wenn ich eine Million Einträge schreiben will, dauert (bei einer Messung) ca. 5,38 Sekunden.
Das Lesen der zuvor angelegten Datei dauert ca. 4,33 Sekunden. Excel braucht da schon deutlich länger

Für diesen Beitrag haben gedankt: mkRE
mkRE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: So 17.01.16 17:07 
Hallo Leute erstmal bin ich sehr sehr begeistert über euer Engagement und die Beispiele -> mehr als ich erwartet habe!!
Ich habe somit viel Stoff wo ich ansetzen kann :D .

Ich komme nochmal zu der Excel Datei bzw. jetzt aktuell CSV Format zurück.
Das war in erster Linie angedacht, das bei der Anwendung die Möglichkeit besteht auf Anfrage diese Datei bzw. Messwert Erfassung jederzeit herunter zu laden damit das auf jeden Haushalt PC angezeigt werden kann, ich glaube aber das habt ihr auch so verstanden.

Wenn jedoch direkt in CSV Format zu schreiben sinnvoll wäre für die angedachte Anwendung, dann interessiert mich wie die Performance bei CSV ist bzw. bin ich da ggf. Zeitlich ihrgendwann an der Grenze wenn es um die schreib Intervalle geht?

Viele wege führen nach Rom aber welcher weg ist der professionelle?
Christoph1972 und Palladin007 eure Ansätze vor dem CSV Thema ist für mich Professional angedacht kiene Frage, da Ihr das auch im Täglichen leben nutzt wie ich verstanden habe.
Aber wie sieht es da mit csv aus für z.B. Messanwendungen(Ich weiß das es verwendet wird aber was ich gesehen habe halt nur als gute Lösung um das Ergebnis Universell auf jedem PC anzeigen zu können via Excel usw. )?

Viele Grüße an alle!!
mkRE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: So 17.01.16 17:32 
Hallo C#, habe dich übersehen sorry :D

user profile iconC# hat folgendes geschrieben Zum zitierten Posting springen:

Also wenn ich das richig sehe, besteht dein Datensatz nur aus einem Integer Wert, korrekt?


Ich habe bei dem Messwert an ein Real bzw. Float Wert gedacht weil ich noch einige nach Kommastellen haben möchte.

Vielleicht ist das noch wichtig als Information.

Viele Grüße
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 17.01.16 17:53 
Zitat:
Wenn jedoch direkt in CSV Format zu schreiben sinnvoll wäre für die angedachte Anwendung, dann interessiert mich wie die Performance bei CSV ist bzw. bin ich da ggf. Zeitlich ihrgendwann an der Grenze wenn es um die schreib Intervalle geht?


File schreiben ist File schreiben da ist das interne Format relativ irrelevant. Wenn du dich zwischen Formaten entscheidest sind die der Faktor Lesbarkeit (soll der Inhalt ohne Zusatzinformation verstehbar sein), Kompaktheit (wieviel Redundanz bringt das Format mit um insbesondere ersteren Punkt zu erreichen) und Weiterverabeitbarkeit (können Fremdsysteme die nix von meiner Anwendung wissen was da was mit anfangen, das angesprochene Excel zum Beispiel) entscheidend. Ein wichtiger Faktor, der bei dir aber wohl nicht wichtig ist, ist ob Daten einfach Appendable sind. Xml, Json sind da eher schwierig zu handhaben und fertige System im Framework gehen eher von komplett lesen/schreiben aus. CSV Daten sind leicht anhängbar darum sind ja die meisten Log Fileformate csv oder zumindest csv ähnlich bzw. binär dann aber schwer von Fremdsystemen weiterverarbeitbar. Soweit ich dein anliegen verstehe ist ein csv Format den anderen Kandidaten vorzuziehen. Letztlich aber wenn du ein sauberes Klassensystem aufgesetzt hast ist der zu benutzende Serializer leicht auszutauschen. Ob es dann JSON, XML, binär, CSV oder was auch immer ist nur noch eine Frage von ein paar Handgriffen. Bei einer Lösung mit einer DataTable wärst du allerdings eher ein gefangener dieser Lösung. Das mal schnell zu ändern eher schwierig. Da du eine Lösung um die DataTable herum schreiben würdest ist die schwer wieder loszuwerden wenn sich die Anforderungen ändern. Ich würde davon, in einer lebenden Anwendung deren Anforderungen nicht festgemeißelt sind, abraten.

Zitat:
Aber wie sieht es da mit csv aus für z.B. Messanwendungen


Messen ist ein ziemlich allgemeiner Begriff. Teilbereiche haben vermutlich spezielle Formate die sich irgendwann als Quasistandard herausgebildet haben. Z.B. Network Sniffer (für mich auch eine Art Messanwendung) benutzen gern pcap (oder Abwandlungen davon). Wenn es sowas in deiner Teildisziplin gibt schau es dir an. Wenn nicht scheint csv erstmal eine gute Wahl.


Zuletzt bearbeitet von Ralf Jansen am So 17.01.16 18:41, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: mkRE
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 17.01.16 18:40 
Zitat:
Wenn jedoch direkt in CSV Format zu schreiben sinnvoll wäre für die angedachte Anwendung, dann interessiert mich wie die Performance bei CSV ist bzw. bin ich da ggf. Zeitlich ihrgendwann an der Grenze wenn es um die schreib Intervalle geht?


Hast Du mein PS gelesen?
Um Performance mach dir mal keine Sorgen, nach meiner kurzen Messung hast Du in einer Sekunde Zeit für ca. 185000 Messungen.
In einer Sekunde, 185000 Messungen, meins Du, Du kommst da auch nur ansatzweise ran? :D
Da wird deine ganze Anwendung drum herum schon so stark ausbremsen, dass das nicht funktioniert.
Und ich habe keine SSD :D

Das Gleiche für das Lesen der Datei.

So viele Messdaten kannst Du gar nicht sammeln, dass Du bei dieser CSV-Library ein Performance-Problem bekommst.
mkRE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: So 17.01.16 23:18 
Hallo zusammen, also ich glaube ich habe alle Informationen die ich benötige und wirklich sinnvolle Lösungen erhalten.
Ich kann es nicht oft genug sagen aber ein Lob an die Forum Mitglieder!!!

Für diese Anwendung werde ich besonders aus den Weiterverarbeitungsgründen und der einfachen Handhabung die csv Version wählen.
Hat für meinen Anwendungsfall doch viele Vorteile.

Noch habe ich eine kleinigkeit an Palladin007:

Meinst du den PS zur Performance Geschichte? :) und was meinst du mit deiner kurzen Messung?

Wünsche euch einen schönen Abend.

Viele Grüße
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 17.01.16 23:58 
user profile iconmkRE hat folgendes geschrieben Zum zitierten Posting springen:
Meinst du den PS zur Performance Geschichte? :) und was meinst du mit deiner kurzen Messung?


Das PS unter der Nachricht mit meinem CSV-Beispiel, wo ich mal aufgeführt habe, wie lange es dauert, eine Million Objekte in eine CSV-Datei zu schreiben.
Das meine ich auch mit "meiner kurzen Messung": Die Messung, wo ich die Million Einträge in die Datei schreibe und messe, wie lange das dauert.

Ich wollte damit nur aufführen, dass die Library tatsächlich so schnell ist, wie sie verspricht und Du die Frage, ob es eine Performance-Grenze gibt, komplett ignorieren kannst. :D
Die Performance-Grenze kommt wenn dann von dir bzw. deiner Anwendung und da haben wir keinen Einfluss drauf.
mkRE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Mo 18.01.16 00:06 
Ok habs jetzt verstanden danke dir!!
Habt mir echt weitergeholfen.

:D
mkRE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Sa 06.02.16 16:26 
Hallo zusammen,

ich habe mich gestern an das Thema hier auch in der Praxis probiert.
Ich habe es soweit hinbekommen daten zu lesen und zu schreiben in und aus einer csv Datei.

Ich benutze jedoch den StreamReader und StreamWriter.
Lieber hätte ich das so wie Palladin007 es in seinen Beispielen gezeigt hat leider habe ich da noch einige Verständnis Probleme.

Ich bekomme hier immer SyntaxFehler Anzeige bei bzw. unter <Measurement> var csvFile = new CsvFile<Measurement>("measurements.csv") als hätte ich da keine Using Direktive.

Das wäre so mein erstes Problem.

Ein weiteres Problem ist, das ich gemerkt habe das csv eine Textdatei ist und die Daten sind dann immer schön in einer Spalte wenn ich es mit Excel Aufmache

Zelle A1
Zelle A2
""
""

So wie ich mich im Netz eingelesen habe kann ich die Daten nicht wie bei Excel in gezielte Zellen z.B. A1 B1 C1 usw schreiben.
Für meinen Anwendungsfall ist ist nicht so wichtig aber es würde mich interessieren ob ich es richtig verstanden habe, das es gar nicht möglich ist?
Ich bin mir nicht ganz sicher aber ich meine gesehen zu haben, das ich mal bei einem Datalogger eine csv. Datei generieren kann und die Daten dan in verschiedenen Zellen und Spalten hatte.
Jedoch bin ich mir da nicht ganz sicher.

Würde mich freuen wenn wir die Punkte noch etwas diskutieren könnten.

Vielen Dank
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 06.02.16 16:36 
Zitat:
So wie ich mich im Netz eingelesen habe kann ich die Daten nicht wie bei Excel in gezielte Zellen z.B. A1 B1 C1 usw schreiben.


Simple Antwort "Excel ist halt eine unappetitliche braune Masse". Auch wenn c in csv für character oder comma steht versteht Excel als Trennzeichen standardmäßig nur Semikolon.

Zitat:
Ich bekomme hier immer SyntaxFehler


Eine halbwegs aktuelle Visual Studio/Framework Version sollte das eigentlich kennen.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Sa 06.02.16 17:01 
Zitat:
Ich bekomme hier immer SyntaxFehler


Du musst die CSV-Library auch in dein Projekt mit auf nehmen ;)
Schau dir mal den Artikel an, wo ich das her habe, da wird alles erklärt.
Ganz unten steht dann der Source, den einfach in eine cs-Datei kopieren, passende using-Direktive hinzufügen und fertig.
mkRE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: So 07.02.16 15:24 
Hallo Ralf,

Zitat:
Simple Antwort "Excel ist halt eine unappetitliche braune Masse". Auch wenn c in csv für character oder comma steht versteht Excel als Trennzeichen standardmäßig nur Semikolon.


Ok die Trennzeichen wären also der Unterschied. Danke

Aber das mit der unappetitlichen braunen Masse musst du mir bitte mal erklären :?: :D (Ich vermute das du damit die Flexibilität in verschiedenen Spalten und Zeilen meinst)

Viele Grüße
mkRE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: So 07.02.16 15:26 
Hallo Palladin007,

danke vielmals ich hab den Link übersehen :oops:

Viele Grüße
mkRE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Sa 27.02.16 18:33 
Hallo zusammen,

ich habe mal eine Frage welche im Zusammenhang mit der Beispielanwendung von Palladin007 zusammenhängt.
Dieses Beispiel funktioniert wunderbar ich habe diese in WinForms laufen.

Wenn ich nun wie im Code Thread.Sleep(500) verwende passt es ganz gut das jede Sekunde 2 Einträge gemacht werden.
Jetzt habe ich das Thema mal ausprobiert bei Thread.Sleep(250) komme ich auch auf 4 Einträge pro Sekunde wunderbar.
Wenn ich nun Thread.Sleep(20) eintrage sollte ich theoretisch auf 50 Einträge kommen jedoch sind es bei mir nur 32 Einträge pro Sekunde.
Gehe ich noch weiter Thread.Sleep(1) dann müsste ich ja 1000 Einträge pro Sekunde erwarten da komme ich nicht mal annähernd ran.

Nun zu der Frage warum verhält sich das ganze im höheren Taktbereich auf einmal so komisch das ich nicht mehr auf die erwarteten Einträge komme?
Mit Thread.Sleep sage ich dem System doch das ich in der angegebenen Zeit eine Ruhepause brauche und danach soll der Vorgang wieder fortgeführt werden.
Wenn ich das ganze ohne Thread Sleep ausführe habe ich in ca 3,..s 1.000.000 Einträge ich wollte das aber im höheren Taktbereich etwas kontrollieren jedoch passt das nicht mehr wie oben beschrieben.


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
        using (var csvFile = new CsvFile<Measurement>("measurements.csv"))
        {
            for (int i = 0; i < 100; i++)
            {
                // Zwei Messungen pro Sekunde:
                Thread.Sleep(500);

                var measurement = new Measurement()
                {
                    Size = MeasurementSource.GetNextSize(),
                    Timestamp = DateTime.Now,
                    // Weitere Eigenschaften:
                    // ...
                };

                csvFile.Append(measurement);
            }
        }


Habt Ihr eine Idee woran das liegt?

Freue mich auf Ideen und Antworten.

Viele Grüße
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 27.02.16 18:55 
Zitat:
Mit Thread.Sleep sage ich dem System doch das ich in der angegebenen Zeit eine Ruhepause brauche und danach soll der Vorgang wieder fortgeführt werden.


Nicht ganz du sagst das du mindestens solange schlafen willst. In Windows bekommt jeder Thread mal Rechenzeit zugewiesen das steuert Windows und nicht irgendein User Prozess. Und mit Thread.Sleep sagt du "Ich brauche jetzt keine Rechenzeit mehr und bevor n Millisekunden abgelaufen sind brauchst du mir auch keine mehr zuzuweisen".
Und 2.tens es gibt ein Mindestauflösung wie oft Windows Taskwechsel versucht die Standardmäßig irgendwo bei 15,6ms liegt. Die Auflösung kann man zwar ändern sollte man aber nicht tun (Kostet richtig Performance und Strom wenn man Windows ganz oft dazu zwingt zu prüfen ob es einen Taskswitch machen muß und im schlimmsten Fall auch ganz oft Takswitches durchführen lässt).
mkRE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Sa 27.02.16 19:59 
Hallo Ralf danke für die schnelle Anwort gut erklärt!

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:

"Ich brauche jetzt keine Rechenzeit mehr und bevor n Millisekunden abgelaufen sind brauchst du mir auch keine mehr zuzuweisen".


Den Schlußteil deines Satzes jedoch hoffe ich habe ich richtig verstanden das nach Ablauf der angegebenen Zeit noch keine Rechenzeit zugewiesen wurde?!
Aber erst wenn sich die Schleiße wie im oberen Code fortführt, bekomme ich wieder Rechenzeit reserviert bzw. zugewiesen? Funktioniert das so?
Ich muss zugestehen hier kenne ich mich nicht so gut aus.


Mit welcher möglichkeit würde ich den dann auf einen stabilen bzw. zuverlässigen Takt von z.B. 1 - 20ms unter windows kommen?
Der WinForms Timer liegt auch bei ca. 15ms an seinen Grenzen jetzt weiß ich nicht ob der Multimedia Timer das stabil hinbekommt.

Viele Grüße
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Sa 27.02.16 20:09 
user profile iconmkRE hat folgendes geschrieben Zum zitierten Posting springen:
Mit welcher möglichkeit würde ich den dann auf einen stabilen bzw. zuverlässigen Takt von z.B. 1 - 20ms unter windows kommen?

Eigentlich gar nicht, am ehesten noch mit Windows-Embedded.

Grund ist, dass in Windows eigentlich jederzeit ein Prozess mit hoher Priorität Rechenzeit verlangen könnte. Die bekommt er in der Regel auch, und dein Programm guckt in die Röhre. Aber selbst wenn du dich hochpriorisiert und rechnest, wird Windows dein Programm ab und an unterbrechen damit andere auch mal rechnen dürfen. Und eventuell ist auch mal der RAM voll und die HDD schläft gerade ...

Wenn du wirklich einen zuverlässigen Takt brauchst, nimm einen Mikrocontroller den du bspw. an einen seriellen Port anschließt.