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
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"?
Die "mapping class" ist deine Datenklasse, also z.B. Person oder Auto.
Ach so, macht Sinn. 😁
Kann ich aber
public class CSVWriter
{}
schreiben als Anfang?
Du kannst alles schreiben (auch als Anfang) ... der Sinn erschließt sich mir allerdings nicht
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 😉
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.
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)
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.
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)
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.
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
Das letzte was ich wollte ist irgendwem böse Absichten zu unterstellen 8o
Entschuldigung bei allen, ich werde versuchen es iwie selber hinzubekommen
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 😉
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..
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 |
okay, danke schon mal 🙂
Aber wenn ich jetzt
CSVWriter.SaveFileAuto(_autos);
in meinen Hauptcode schreibe, dann müssten doch alle Autos gespeichert sein oder?
Wenn ich das aber genau so mit dem Debugger durchlaufen lassen, dann zeigt er mir alle vorhandenen Autos an 🤔
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.
ach so, also fehlt mir sowas wie
File.WriteAllText(@"Name.csv", autos);
? Dass er auch alles in eine Datei schreibt?
Genau.
Edit:
Das "Genau." bezieht sich auf das "etwas wie File.WriteAllText".
123thomas' Einwände sollten natürlich beachtet werden.
Nein, "autos" ist ja die Liste.
du muss deinen: "fileContent" nehmen und den als Inhalt wegschreiben.
File.WriteAllText(@"Name.csv", fileContent);
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 ..?
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.
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... 😄
(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)
(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. 😉
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich finde, dass es nicht schaden kann, wenn man sowas als kleine Übung mal gemacht hat.
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. 🙂
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)
Vielen Dank für die 'netten' Worte @LaTino.
Kann ichs ja anscheinend gleich sein lassen, wenn es eh zu spät ist. 👍
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 |
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)
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 😁
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)
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... 😄
Bitte mal wieder zum Thema zurückkommen.