myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Wie kann ich einer CSV einen Header hinzufügen?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wie kann ich einer CSV einen Header hinzufügen?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
xxTonixx xxTonixx ist männlich
myCSharp.de-Mitglied

Dabei seit: 14.09.2020
Beiträge: 3


xxTonixx ist offline

Wie kann ich einer CSV einen Header hinzufügen?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
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);

            }

        }
Neuer Beitrag 14.09.2020 10:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.598
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist online Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
Neuer Beitrag 14.09.2020 11:18 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.202
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Bitte Code in die Tags setzen. Niemand hat Lust Plaintext-Code zu lesen.
 [Hinweis] Wie poste ich richtig?
Neuer Beitrag 14.09.2020 12:25 Beiträge des Benutzers | zu Buddylist hinzufügen
xxTonixx xxTonixx ist männlich
myCSharp.de-Mitglied

Dabei seit: 14.09.2020
Beiträge: 3

Themenstarter Thema begonnen von xxTonixx

xxTonixx ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

C#-Code:
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.
Neuer Beitrag 14.09.2020 12:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JimStark
myCSharp.de-Mitglied

avatar-1005.jpg


Dabei seit: 10.03.2020
Beiträge: 111
Entwicklungsumgebung: Visual Studio 6.0 Enterprise


JimStark ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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


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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von JimStark am 14.09.2020 12:35.

Neuer Beitrag 14.09.2020 12:34 Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.202
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 :-)
Neuer Beitrag 14.09.2020 12:41 Beiträge des Benutzers | zu Buddylist hinzufügen
xxTonixx xxTonixx ist männlich
myCSharp.de-Mitglied

Dabei seit: 14.09.2020
Beiträge: 3

Themenstarter Thema begonnen von xxTonixx

xxTonixx ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 traurig

Nun funktioniert es wie gewünscht, Dankeschön!
Neuer Beitrag 14.09.2020 14:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 27.09.2020 15:06