Laden...

Daten in CSV Format speichern bzw einlesen?

Erstellt von Lens445 vor 6 Jahren Letzter Beitrag vor 6 Jahren 12.302 Views
L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren
Daten in CSV Format speichern bzw einlesen?

Hey Leute,

Bin ja neu in der Welt des Programmierens.
Habe mir ein Consolen Programm erstellt, dass mir verschiedene Werte einer Liste ausgibt, z.B. verschiedene Personen und Autos und ich kann die Personen und Autos auch miteinander verknüpfen mit einer n:m Beziehung. Klappt alles so weit ohne Fehler. Jetzt möchte ich, dass die gemachten Veränderungen und Eingaben nicht immer verloren gehen, sondern alle Informationen gespeichert werden.
Habe mich für CSV entschieden, habe allerdings sowas noch nie erstellt.

Mein Ziel ist es also, nach jeder Aktion im Programm sollen alle Infos automatisch gespeichert werden.

So, ich habe viel gegoogelt, aber keine passende Lösung gefunden.
Muss ich eine neue Klasse aufmachen in C# und dort eine CSV Datei erstellen? oder in meiner Main?
Möchte nur gerne den Anfang wissen, was ich tun muss um sowas zu erstellen..

Liebe Grüße

D
985 Beiträge seit 2014
vor 6 Jahren

Auf der Seite filehelpers.net solltest du alles finden

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

Hey danke für die Seite.

Also lieg ich aber richtig, dass man dafür ne neue Klasse öffnen muss oder? Weil dort auch steht "mapping class"?

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

Ach so, macht Sinn. 😁

Kann ich aber

public class CSVWriter
{}

schreiben als Anfang?

D
985 Beiträge seit 2014
vor 6 Jahren

Du kannst alles schreiben (auch als Anfang) ... der Sinn erschließt sich mir allerdings nicht

M
368 Beiträge seit 2006
vor 6 Jahren
public class CSVWriter  
{}  

schreiben als Anfang?

Einfach mal das Tutorial ausprobieren und "Customers" durch "CSVWriter" ersetzen:
(natürlich nur als Übung, nicht als Sinnfrage...)


public class CSVWriter
    {
        public int CustId;

        public string Name;

        public decimal Balance;

        [FieldConverter(ConverterKind.Date, "dd-MM-yyyy")]
        public DateTime AddedDate;


        static void Main(string[] args)
        {
            var engine = new FileHelperEngine<CSVWriter>();

            // To Read Use:
            var result = engine.ReadFile(@"eventuell\Pfad\zur\FileIn.txt");
            // result is now an array of Customer

           
            foreach (CSVWriter cust in result)
            {
                Console.WriteLine("Customer Info:");
                Console.WriteLine(cust.Name + " - " +
                                  cust.AddedDate.ToString("dd/MM/yy"));
            }
            Console.ReadLine();
        }
   

Funktioniert als Konsolenprogramm.

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

Ja, aber das hilft mir ja alles nicht wirklich weiter, ich will ja mein Konsolen Programm in CSV Format speichern.

Mein Programm beginnt ja schon mal mit:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Fuhrpark1
{
    class Fuhrpark
    {
        private static List<Auto> _autos = new List<Auto>(); // Anlegen von neuer Liste für Autos
        private static List<Personen> _personen = new List<Personen>(); // Anlegen von neuer Liste für Personen

        static void Main(string[] args)
        {
            do
            {
                Console.WriteLine(
                    "\n" +
                    "Wähle bitte eine Möglichkeit: \n\n" +
                    "1 für das Anlegen eines neuen Autos \n" +
                    "2 für das Anzeigen der vorhandenen Autos \n" +
                    "3 für das Anlegen von Personen \n" +
                    "4 für das Anzeigen von vorhandenen Personen \n\n" +
                    "5 für das Löschen einer Person \n" +
                    "6 für das Löschen eines Autos \n" +
                    "7 für das Bearbeiten einer Person \n" +
                    "8 für das Bearbeiten eines Autos \n\n" +
                    "9 für das Verknüpfen von Auto und Personen\n" +
                    "0 Für das Anzeigen der Verknüpfungen\n");                
                input = Console.ReadKey().Key;
                Console.Clear();

also nur ein kleiner Ausschnitt vom Anfang, und ich will jez dass immer wenn ich eine Person/Auto anlege oder verknüpfe dass es mir das in CSV Format speichert.

H
523 Beiträge seit 2008
vor 6 Jahren

Hast Du Dir die Beispiele auf filehelpers.net angeschaut? Z. B. dieses hier?

3.003 Beiträge seit 2006
vor 6 Jahren

ich will ja mein Konsolen Programm in CSV Format speichern.

Achso. Wir dachten, du willst was lernen. Aber so ist natürlich klar, wieso du alle Tipps und Hinweise ignorierst.


File.WriteAllText("beispiel.csv", _personen.Aggregate(new StringBuilder(), (sb, p) => sb.AppendLine($"{p.Name};{p.DateOfBirth:yyyy-MM-dd}")).ToString());

Bittesehr.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

Hä? nein, nur wollte ich eine Erklärung dazu haben mensch..
Sorry, das ich Anfänger bin und es nicht verstanden habe.

Ja, ich habe mir alle Beispiele angeschaut, nur war bei mir immer alles falsch und es kamen nur Fehlermeldungen, deswegen dachte ich, dass das nicht die richtige Lösung war.

Nicht sehr freundlich mich gleich so anzuschnauzen.

3.003 Beiträge seit 2006
vor 6 Jahren

Nunja, M.L. hat dir ein fertiges Stück Code gepostet, das du nur hättest kopieren, verstehen, und bei dir einbauen hättest müssen. Die Tatsache, dass stattdessen nur "das hilft mir alles nicht weiter" kam, sagt mir, dass du kein Interesse daran haben kannst, wirklich was zu lernen. Ansonsten wärst du jetzt nämlich damit beschäftigt, die Beispiele auf FileHelpers.net durchzuarbeiten.

Was ich damit sagen will: zeig bitte, dass du es wenigstens versuchst. "nur war bei mir immer alles falsch" und "es kamen nur Fehlermeldungen" sind Aussagen, die ich von meiner Großmutter erwarten würde, aber nicht von jemandem, der programmieren möchte.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

Ich habe es probiert! Mega viele Varianten..

Mein Problem ist, dass ich sowas noch nie gemacht habe und jetzt halt nicht weiß, kommt das alles vor static void Main?

weil da hab ich ja bereits eine Klasse mit Fuhrpark, muss danach die Klasse CSVWriter? Das würde mir schon sehr viel weiter helfen, dass zu wissen.

Hab nie nach einer vollständigen Lösung verlangt.

Noch hinzu kommt, im Internet steht nie was man tun soll, wenn das Programm, anlegen, löschen und editieren kann und man das alles speichern möchte.

5.657 Beiträge seit 2006
vor 6 Jahren

Ich habe es probiert! Mega viele Varianten..

Du hast eine Lösung auf dem Silbertablett serviert bekommen. Wenn es bei dir nicht funktioniert, dann poste eine ausführliche Fehlerbeschreibung und eine evtl. Fehlermeldung. Siehe dazu [Hinweis] Wie poste ich richtig?

Mein Problem ist, dass ich sowas noch nie gemacht habe und jetzt halt nicht weiß, kommt das alles vor static void Main?

Bitte lies [FAQ] Wie finde ich den Einstieg in C#?

Noch hinzu kommt, im Internet steht nie was man tun soll, wenn das Programm, anlegen, löschen und editieren kann und man das alles speichern möchte.

Andere Leute vor dir haben auch schon Programme geschrieben, die Daten lesen, bearbeiten und speichern können. So ziemlich jedes Programm macht das. Viele davon sind als OpenSource verfügbar. Da könntest du dir anschauen, wie es andere vor dir gelöst haben. Wenn du aber schon an einem so einfachen Problem scheiterst, dann mußt du eben erstmal einen Schritt zurücktreten und dich mit den Grundlagen von Objektorientierter Programmierung und C# beschäftigen. Das können wir dir nicht abnehmen. Aber Leuten, die dir dabei helfen, böse Absichten zu unterstellen, hilft dir ganz bestimmt nicht weiter.

Weeks of programming can save you hours of planning

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

Das letzte was ich wollte ist irgendwem böse Absichten zu unterstellen 8o

Entschuldigung bei allen, ich werde versuchen es iwie selber hinzubekommen

M
368 Beiträge seit 2006
vor 6 Jahren

Ich habe es probiert! Mega viele Varianten.. Mit Hausmitteln des .NET Framework ( z.B. TextFieldParser des Namespace Microsoft.VisualBasic.FileIO ) oder FileHelpers ?
Mein Problem ist, dass ich sowas noch nie gemacht habe und jetzt halt nicht weiß, kommt das alles vor static void Main?

Man kann es anhand der Tutorials von FileHelper mal ausprobieren und die Klassendefinitionen in die Main-Methode schreiben. Allerdings gibt es dann auch genug Compiler Fehlermeldungen... Für später noch: Debugger von VS

weil da hab ich ja bereits eine Klasse mit Fuhrpark, muss danach die Klasse CSVWriter? Das würde mir schon sehr viel weiter helfen, dass zu wissen. Käme auf die Struktur und Funktionalität der Klassen an, immerhin lassen sich die Namen und Attribute dort und in den csv-Dateien anpassen.

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

So habe eine Klasse CSVWriter erstellt:

    public static class CSVWriter
    {       
        public static void SaveFileAuto(List<Auto> autos)
        {
            // Erste Zeile (Header für Auto)
            string fileContent = "Hersteller;Modell;Farbe;Kennzeichen" + Environment.NewLine;

            // weitere Zeilen hinzufügen
            foreach (var auto in autos)
            {
                fileContent += auto.Hersteller + ";" + auto.Modell + ";" + auto.Farbe + ";" + auto.Kennzeichen + Environment.NewLine;
            }
        }

        public static void SafeFilePersonen(List<Personen> personen)
        {
            // Erste Zeile (Header für Personen)
            string fileContent = "Vorname;Nachname,Geburtstag" + Environment.NewLine;
            
            // weitere Zeilen hinzufügen
            foreach (var person in personen)
            {
                 fileContent += person.Vorname + ";" + person.Nachname + ";" + person.Geburtstag + Environment.NewLine;
            }         
        }       
    }

jetzt muss ich es noch ausgeben als CSV Datei..

2.298 Beiträge seit 2010
vor 6 Jahren

Hallo,

wenn du den Ausgabestring schon vorher zusammenbaust empfehle ich dir den StringBuilder und StringFormat. Du hast aktuell das Problem, dass du massenhaft Strings erstellst.

Ein Beispiel wie es funktionieren kann (ungetestet):


        public void WriteToCSV(IEnumerable<Auto> data, string fileName)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("Hersteller;Modell;Farbe;Kennzeichen;");
            foreach (Car auto in data)
            {
                sb.AppendLine(String.Format("{0};{1};{2};{3};", auto.Hersteller, auto.Modell, auto.Farbe, auto.Kennzeichen));
            }

            File.WriteAllText(fileName, sb.ToString());
        }

Die Zeile zum Schreiben in ein Textdokument ist enthalten. Hättest du aber mit wenig Mühe auch selbst finden müssen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

okay, danke schon mal 🙂

Aber wenn ich jetzt

CSVWriter.SaveFileAuto(_autos);

in meinen Hauptcode schreibe, dann müssten doch alle Autos gespeichert sein oder?

D
985 Beiträge seit 2014
vor 6 Jahren

Mit deinem Code? Nein.

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

Wenn ich das aber genau so mit dem Debugger durchlaufen lassen, dann zeigt er mir alle vorhandenen Autos an 🤔

D
985 Beiträge seit 2014
vor 6 Jahren

Ja, das macht dein Code ja auch, aber das ist ein flüchtiger Inhalt, der nach dem Verlassen der Methode entsorgt wird.

Von Speichern kann man da wirklich nicht sprechen.

1
124 Beiträge seit 2012
vor 6 Jahren

Du hast jetzt lediglich, den Dateiinhalt zusammen gebaut. Nun musst du mithilfe von File den Inhalt in eine Datei schreiben.

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

ach so, also fehlt mir sowas wie

File.WriteAllText(@"Name.csv", autos);

? Dass er auch alles in eine Datei schreibt?

709 Beiträge seit 2008
vor 6 Jahren

Genau.

Edit:
Das "Genau." bezieht sich auf das "etwas wie File.WriteAllText".
123thomas' Einwände sollten natürlich beachtet werden.

1
124 Beiträge seit 2012
vor 6 Jahren

Nein, "autos" ist ja die Liste.
du muss deinen: "fileContent" nehmen und den als Inhalt wegschreiben.

File.WriteAllText(@"Name.csv", fileContent);
L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

Ja, habe ich vorhin auch selber bemerkt 😁 👍

Aber danke! Hat geklappt 🙂

So jetzt muss ich schauen, dass immer wenn ich das Programm schließe, dass dann die gespeicherten Daten angezeigt werden.

Muss ich quasi alles rückwärts machen jez oder? Also Datei lesen, spliten ..?

709 Beiträge seit 2008
vor 6 Jahren

Wenn das Programm geschlossen ist, kannst du keine Daten mehr anzeigen. 👅

Ich nehme aber an, dass du öffnen meinst.
Dann liest du die Datei(en) ein und pulst dir da die Daten entsprechend raus, erzeugst damit deine Objekte und stellst diese entsprechend dar.

T
461 Beiträge seit 2013
vor 6 Jahren

Hallo,

ich würde ja eine Methode für das Speichern und Laden schaffen, die unabhängig von der Klasse z.Bps. Auto ist...

Daher du ja auch andere Datenklassen hast, sonst müßtest für jede neue Klasse eine weitere Methode hinzufügen...

😁

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

3.003 Beiträge seit 2006
vor 6 Jahren

(Das alles könnte man sich sparen, wenn man ein vernünftiges Dateiformat anstelle von CSV genommen hätte...)

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

2.078 Beiträge seit 2012
vor 6 Jahren

(CSV ist ein vernünftiges Dateiformat, ob es für den aktuellen Anwendungsfall gut geeignet ist, steht aber auf einem anderen Blatt 😉)

Viel eher könnte man sich die Arbeit sparen, indem man bereits vorhandene Tools dazu nutzt.
FileHelpers.net wurde schon genannt
Ich persönlich bin (im Zusammenhang mit CSV) ein Fan vom CsvHelper

FileHelpers kenne ich nicht, aber der CsvHelper tut genau das, was Du haben willst:
Schreiben vieler Objekte einer Klasse in eine CSV-Datei
Lesen einer CSV-Datei in viele Objekte einer Klasse

Die Klasse(n) hast Du schon, fehlt noch das Mapping, wo drin steht, welcher Wert wo hin geschrieben werden soll. Du kannst aber auch mal ausprobieren, ohne Mapping zu arbeiten, ich meine mich zu erinnern, dass er dann ein automatisches Mapping anhand der Property-Namen und deren Reihenfolge baut.

Hilfen dazu gibts auf der verlinkten Website genug.

Wenn CSV kein Zwang ist, würde ich eher zu XML raten. Das ist sehr viel flexibler als CSV und .NET bringt mit dem XmlSerializer (etwas besseres Beispiel) eine denkbar einfache Schnittstelle zum Lesen/Schreiben von XML mit.
Wenn es etwas spezieller sein soll, gibts aber auch noch LINQ to XML, damit müsstest Du jede Anforderung beim Lesen/Schreiben von XML erschlagen können.

Allgemein solltest Du dir aber unbedingt den von MrSparkle verlinkten Artikel [FAQ] Wie finde ich den Einstieg in C#? anschauen.
Insbesondere das dort ganz oben verlinkte Buch Visual C# 2012 ist mMn. sehr zu empfehlen und klärt garantiert einige deiner Fragen auf.
Dort ist übrigens auch das Thema Serialisierung ein großes Thema, also genau das, was Du suchst. 😉

16.806 Beiträge seit 2008
vor 6 Jahren

Mich wundert, dass so lange hier niemand was gegen CSV gesagt hat, denn sowohl XML und Json bieten viel bessere Möglichkeiten der Speicherung solcher Daten - inklusive der Validierung von gespeicherten Dateien durch Schemas.

709 Beiträge seit 2008
vor 6 Jahren

Ich finde, dass es nicht schaden kann, wenn man sowas als kleine Übung mal gemacht hat.

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

Eben, ich will einfach verschiedenes versuchen zu üben 🙂

Will dann das ganze auch noch mit XML probieren.. einfach um das mal gemacht zu haben.

Und ich will das Ganze auch nicht mit Helfern oder Librarys machen, sondern eben selber. 🙂

3.003 Beiträge seit 2006
vor 6 Jahren

Ich finde, dass es nicht schaden kann, wenn man sowas als kleine Übung mal gemacht hat.

Und ob es das kann.
Aus didaktischer Sicht ist das aber eine Katastrophe. Erst Serialisierung benutzen, DANN von Hand Textdateien schreiben und lesen - so herum wird ein Schuh draus. Ansonsten, das das wird dir jeder bestätigen, der mal C#-Kurse für Schüler oder Studenten gegeben hab, wird IMMER von Hand serialisiert und gefrickelt, wo man eine normale Serialisierung benutzen müsste.

Naja, ist hier eh zu spät.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

Vielen Dank für die 'netten' Worte @LaTino.

Kann ichs ja anscheinend gleich sein lassen, wenn es eh zu spät ist. 👍

2.298 Beiträge seit 2010
vor 6 Jahren

Hallo Lens445,

versteh doch LaTino bitte nicht falsch. Aber: Es ist ein oft gemachter Fehler, das Rad neu zu erfinden. Gerade für die Speicherung und das Laden von Objekten gibt es gut ausgefeilte Lösungen, für die das Rad nicht immer neu erfunden werden muss.

Sieh es mal so, deiner Speicherung in CSV-Dateien ist aus meiner Sicht nichts zu entgegnen. Aber zum einen ist dein Ansatz so, dass du für jeden Typen eine neue Methode schreiben musst. Zum anderen ist es nicht wirklich einfach eine generische Lösung dafür zu finden. Da ist es doch gut, dass sich andere schon Gedanken darüber gemacht haben und du deren Lösung einfach verwenden kannst.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

3.003 Beiträge seit 2006
vor 6 Jahren

Du bist ziemlich schnell auf deiner Insel der Eingeschnappten, kann das sein?

Es ist zu spät, mit richtiger Serialisierung zu beginnen, weil du schon mitten im CSV-Frickeln bist. Das ist ein Fakt, oder etwa nicht? Und ich wage mich nicht zu weit auf's Glatteis, wenn ich vorhersage, dass dich das in Schwierigkeiten bringt, sobald du versuchst, mit XML zu arbeiten. Das ist schade, weil's dich beim Lernen frustrieren wird, aber jetzt nun einmal nicht mehr zu ändern. Es sei denn natürlich, du hättest eine Zeitmaschine.

LaTino
(EDIT: und wirklich, du solltest etwas abgeklärter sein und nicht alles sofort auf deine Person beziehen.)

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

D
985 Beiträge seit 2014
vor 6 Jahren

Grundsätzliches Problem bei 99% der „Ich implementiere das mal eben schnell selber“-Entwicklern ist das fehlende Wissen um die Spezifikation.

Für CSV Dateien gibt es RFC 4180

Wenn du mal XML Dateien verarbeiten musst, die im Header explizit das UTF-8-Encoding angeben (ist eigentlich obsolet, denn wenn da nix steht, dann gilt UTF-8), als Encoding für die Datei allerdings irgendein Encoding (ASCII) verwendet haben, dann weiß man, dass da wieder so ein Bastel-Fritze am Werke war.

Und das Gespräch über diese fehlerhafte XML-Datei war vergleichbar mit YouTube: The Expert

PS: Diese XML-Datei kam von keiner Hinterhof-Softwarebude - obwohl, irgendwie dann wohl doch 😁

3.003 Beiträge seit 2006
vor 6 Jahren

Und das Gespräch über diese fehlerhafte XML-Datei war vergleichbar mit
>

Mwaha, den kannte ich noch nicht. Wird jetzt wohl in den Büros rumgehen 😉. Danke!

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

T
461 Beiträge seit 2013
vor 6 Jahren

Hey @Lens445, laß dich nicht unterkriegen, es ist noch kein Meister vom Himmel gefallen 😉
Zu spät ist es erst, wenn man ein Alter erreicht hat und man langsam anfängt die Radieschen zu riechen...

Ich selbst hab sicher auch mehr als die Hälfte falsch gemacht bis zu dem Zeitpunkt wo ich jetzt stehe, hatte mir alles selbst erlernen müssen mit Hilfe vom Internet und teilweise von Euch OHNE Schule... (hatte ganz bestimmte Gründe)

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

Hinweis von MrSparkle vor 6 Jahren

Bitte mal wieder zum Thema zurückkommen.