Laden...

Wie kann ich einer CSV einen Header hinzufügen?

Erstellt von xxTonixx vor 3 Jahren Letzter Beitrag vor 3 Jahren 594 Views
X
xxTonixx Themenstarter:in
3 Beiträge seit 2020
vor 3 Jahren
Wie kann ich einer CSV einen Header hinzufügen?

Hi,
ich bin ziemlich neu in C# und kenne mich bisher nur sehr schlecht aus, muss jedoch in kürzester Zeit auf der Arbeit ein Thema erarbeiten da wir niemanden mehr haben der C# kann.
Eine Lösung habe ich bisher im Internet nicht gefunden, deshalb hier nun meine kleine Bitte um Hilfe mitsamt Problemstellung:

Ausgangsposition:

Eine Anlage ist ständig in Betrieb und die Temperatursensoren sollen über den Prozess hinweg geloggt werden.
Diese sollen in einer csv Datei landen um sie in der IT nachher auswerten zu können.
Das Auslesen der Variablen und schreiben der .csv funktioniert inzwischen bei mir, die Datei wird jede Sekunde mit Einträge der Temperaturen Zeilenweise erweitert.

Das einzige was mir bisher nicht gelingt und ich nicht auf die Lösung komme ist das einmalige schreiben des Headers in der CSV.

Die Tabelle soll folgendermaßen aussehen:

Date + Time TE1_1 TE1_2 TE1_3 usw..... <<<---- Header fehlt

07.09.2020 11:11 23.5 23.2 21.9 usw...
07.09.2020 11:12 23.2 23.6 21.8 usw...
07.09.2020 11:13 23.3 23.2 21.9 usw...
07.09.2020 11:14 23.4 23.1 21.8 usw...
07.09.2020 11:15 23.5 23.2 21.8 usw...

usw....

Das logging Sekunden- und Zeilenweise ist kein Problem, kann mir jemand eine Lösung für den einmaligen Header oben vorschalgen?
Mein bisheriger Quellcode:

private void _secondTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            bool BoolVariable = ApplicationService.GetVariableValue<bool>("Ch2.AnimatedObjects.Sine.On");  //  ---- Wenn Automatischer Prozess an -------
            var PT100_Report = @"Z:\Projekte\Umbau NF\CSV-TestDatei_Sekundentakt.csv";

            if (BoolVariable == true)
            {
                                         
                int GanzzahlVariable = ApplicationService.GetVariableValue<int>("Ch2.AnimatedDataTypes.DINT");
                double FliesskommaVariable = ApplicationService.GetVariableValue<double>("Ch2.AnimatedDataTypes.REAL");
                string VariableAlsText = ApplicationService.GetVariableValue("Ch2.AnimatedObjects.Sine.Value").ToString();

                string TE1_1_7 = ApplicationService.GetVariableValue("Ch1.PLC.Blocks.30_HV_ActuatorDBs.TE1_1_7.UID").ToString();

                string neueZeile =
                    DateTime.Now.ToString() + ";" +
                    ApplicationService.GetVariableValue("Ch2.AnimatedObjects.Sine.Value") + ";" +
                    ApplicationService.GetVariableValue("Ch2.AnimatedObjects.Sawtooth.Value") + ";" +
                    ApplicationService.GetVariableValue("InputOutput_Text") + ";" +
                    TE1_1_7;

                   File.AppendAllText(@"Z:\Projekte\Umbau NF\CSV-TestDatei_Sekundentakt.csv", neueZeile + Environment.NewLine);

            }

        }
T
2.219 Beiträge seit 2008
vor 3 Jahren

Im einfachsten Fall musst du nur schauen ob die Datei schon vorhanden ist.
Wenn dies nicht der Fall ist, muss du die Datei neu anlegen mit dem Header zuerst.

Es wäre hier sinnvoll, den aktuellen Code aus der UI auszulagern, sonst wird das auf Dauer sehr unsauber und schlecht zu warten zu sein.
Ebenfalls verwendest du feste Pfade -> Das Programm wird dann nur auf diesem Rechner laufen können.

Nutzt am besten einen StringBuilder, dieser fügt dann mit AppenLine() auch das Zeilen Ende ein.
Aktuell bastelst du dir einen String aus X Teilen zusammen, was wiederum unnötige Objetke erzeugt und verwirft.
Mit dem StringBuilder kannst du dies auch sauber lösen ohne temporäre Objekte.
Ebenfalls kannst du damit den Code einfacher erweitern und man kann einfacher erkennen was wo eingefügt werden muss.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.806 Beiträge seit 2008
vor 3 Jahren

Bitte Code in die Tags setzen. Niemand hat Lust Plaintext-Code zu lesen.
[Hinweis] Wie poste ich richtig?

X
xxTonixx Themenstarter:in
3 Beiträge seit 2020
vor 3 Jahren

Diese Möglichkeit habe ich schon getestet, leider ist das Ergebnis anders als gedacht, der schreibt mir dann dennoch in jede zweite Zeile den Header und arbeitet nicht nur in der inneren Schleife.

 private void _secondTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            bool BoolVariable = ApplicationService.GetVariableValue<bool>("Ch2.AnimatedObjects.Sine.On");  //  ---- Wenn Automatischer Prozess an -------
            var PT100_Report = @"Z:\Projekte\Umbau NF\CSV-TestDatei_Sekundentakt.csv";
            string header = "Time";
            if (File.Exists(PT100_Report))
            {      

            if (BoolVariable == true)
            {

                int GanzzahlVariable = ApplicationService.GetVariableValue<int>("Ch2.AnimatedDataTypes.DINT");
                double FliesskommaVariable = ApplicationService.GetVariableValue<double>("Ch2.AnimatedDataTypes.REAL");
                string VariableAlsText = ApplicationService.GetVariableValue("Ch2.AnimatedObjects.Sine.Value").ToString();
                string TE1_1_7 = ApplicationService.GetVariableValue("Ch1.PLC.Blocks.30_HV_ActuatorDBs.TE1_1_7.UID").ToString();

                string neueZeile =
                    DateTime.Now.ToString() + ";" +
                    ApplicationService.GetVariableValue("Ch2.AnimatedObjects.Sine.Value") + ";" +
                    ApplicationService.GetVariableValue("Ch2.AnimatedObjects.Sawtooth.Value") + ";" +
                    ApplicationService.GetVariableValue("InputOutput_Text") + ";" +
                    TE1_1_7;

                   File.AppendAllText(@"Z:\Projekte\Umbau NF\CSV-TestDatei_Sekundentakt.csv", neueZeile + Environment.NewLine);

            }
            
            }
            File.AppendAllText(@"Z:\Projekte\Umbau NF\CSV-TestDatei_Sekundentakt.csv", header + Environment.NewLine);
           
        }

Das Ergebniss zieht wie folgt hierbei aus:

Time
14.09.2020 12:18 0,995756881 33 0
Time
14.09.2020 12:18 0,995756881 33 0
Time
14.09.2020 12:18 0,955360902 41 0
Time
14.09.2020 12:18 0,955360902 41 0
Time
14.09.2020 12:18 0,868371974 47 0
Time

Feste Pfade sind hierbei vorgesehen da wir aus dem Anlagenrechner einen festen Pfad bekommen unter dem der Datenaustausch erfolgen soll.
Code verbessern kann man hinterher immer noch, die Hauptsache ist das es erst mal funktioniert so das wir wenigstens testen können. Die Zeit läuft leider gegen uns.

309 Beiträge seit 2020
vor 3 Jahren

Da fehlt ein else im Code, das hätte man durch die Codeformatierung schon gesehen 😉

=> Und diese Variablennamen,... da muss ich aber los...

16.806 Beiträge seit 2008
vor 3 Jahren

Erneut den Hinweis und die Bitte den Code in Zukunft selbst in die Tags packen.
Müssen nicht wir für Dich tun - Du suchst ja Hilfe 😃

X
xxTonixx Themenstarter:in
3 Beiträge seit 2020
vor 3 Jahren

Dankeschön, der Tipp mit - else - hat geholfen, bin davon ausgegangen das an der Stelle - else - automatisch angewandt wird da es irgendwo mal so erwähnt wurde.

Werde in Zukunft den Code selbst in die Tags packen; habe es überflogen da hier alles gerade schnell schnell passieren muss, Kunde wartet 😭

Nun funktioniert es wie gewünscht, Dankeschön!