Laden...

Speichern in eine bestehende txt-Datei

Erstellt von AceTecNic vor 4 Jahren Letzter Beitrag vor 4 Jahren 2.624 Views
A
AceTecNic Themenstarter:in
51 Beiträge seit 2018
vor 4 Jahren
Speichern in eine bestehende txt-Datei

Hallo zusammen,

ich bastel gerade an einem einfachen Projekt mit dem ich einfach verschiedene Farben, Lagerort und Gewicht erfassen und danach suchen kann.
Das ganze wird (vorläufig) in einer txt Datei gespeichert (irgendwann auf meinem Server) und in einer Listbox angezeigt.

Wenn ich etwas neu hinzufügen möchte (zu der bestehenden txt Datei) überschreibt er mir alles und fügt nur den neuen Wert ein.
Ich würde das ganze jeweils in einer Zeile schreiben. Wobei jede Zeile eine neue Farbe sein soll.

Könnte mir da jemand einen denkanstoß geben? Bin den ganzen Vormittag am suchen aber finde nicht´s spezielles auf mein Problem...


private void btn_Eintragen_Click(object sender, EventArgs e)
        {
            string RAL = txt_in_RAL.Text;
            string Lagerort = txt_in_Lagerort.Text;
            string Gewicht = txt_in_Gewicht.Text;
            File.WriteAllText(@"C:\test.txt", RAL + "\t" + "\t" + Lagerort + "\t" + "\t" + Gewicht);
        }

Danke 😃

U
69 Beiträge seit 2019
vor 4 Jahren

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob
A
AceTecNic Themenstarter:in
51 Beiträge seit 2018
vor 4 Jahren

Super, mit ein bissl basteln hab ichs hinbekommen.

Vielen Dank!!!

Hier der Code:


private void btn_Eintragen_Click(object sender, EventArgs e)
        {
            string Pfad = @"C:\test.txt";
            string RAL = txt_in_RAL.Text;
            string Lagerort = txt_in_Lagerort.Text;
            string Gewicht = txt_in_Gewicht.Text;

            File.AppendAllText(Pfad,"\n" + RAL + "\t" + "\t" + Lagerort + "\t" + "\t" + Gewicht);
         }

A
AceTecNic Themenstarter:in
51 Beiträge seit 2018
vor 4 Jahren

Eine Frage hätte ich noch...

Ich habe in meiner Liste bereits eine Zeile mit beispielsweise:
RAL 5018 Lagerort 100

Wenn ich jetzt dieselbe Farbe dazufügen möchte legt er mir so eine weitere Farbe an. Ist es möglich nur auf das Gewicht dazu zu addieren?

16.807 Beiträge seit 2008
vor 4 Jahren

Solche Logik musst Du selbst umsetzen; das schenkt Dir das Framework natürlich nicht.

Vorgehensweise zB:

  • Gesamte Datei einlesen
  • Zeile suchen
  • Werte ersetzen
  • Datei neu schreiben

Eine PlainTextdatei ist aber eine sehr ungünstige Art und Weise eine solche "Datenbank"-ähnliche Struktur umzusetzen.
Da ist es viel einfach mit XML oder Json zu arbeiten, da Du hier auch gezielt suchen kannst.

Beispiele für die XML-Serialisierung

A
AceTecNic Themenstarter:in
51 Beiträge seit 2018
vor 4 Jahren

Danke für die Antwort.
Ja, das ich mit der Textdatei nicht weit komme wusste ich. Jedoch für meinen Einstieg fand ich das am einfachsten. 😃
Ich hatte auch schon eine SQL Datenbank ins Auge gefasst, allerdings komm ich mit der Verbindung zwischen dem Programm und meinem Server nicht klar.
Werd das wohl über die XML machen und Dateiaustausch mittels FTP.

Dankeschön! 😃

463 Beiträge seit 2009
vor 4 Jahren

Und bitte auch daran denken, dass man niemals direkt auf C: schreibt.

6.911 Beiträge seit 2009
vor 4 Jahren

Hallo AceTecNic,

Werd das wohl über die XML machen und Dateiaustausch mittels FTP.

Machs lieber ordentlich und nimm eine Datenbank.

Welches Problem hattest du mit dem SQL Server? Firewall Port TCP 1433?

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

A
AceTecNic Themenstarter:in
51 Beiträge seit 2018
vor 4 Jahren

@Stefan.Haegele
Normal schreibe ich nicht auf C: - War halt nur zur Veranschaulichung 😃

@gfoidl
Jetzt wo du es schreibst, ich glaube ich hatte den Port vergessen einzutragen...
Hab es zuvor mit HeidiSQL versucht (Port 3306), da wollte es ebenfalls nicht.
Ich kann doch die Listbox direkt mit einer Datenbank verbinden? Im Designer die Listbox auswählen und rechts oben an der Ecke "An Daten gebundene Elemente verwenden".
Oder gibt es da einen besseren Weg?

Ich sag mal so: Die Datenmenge hält sich in Grenzen. Wenn ich 60 Positionen mit jeweils 3 Angaben habe ist das schon das Maximum.

6.911 Beiträge seit 2009
vor 4 Jahren

Hallo AceTecNic,

Ich kann doch die Listbox direkt mit einer Datenbank verbinden?

Ja ist möglich, aber auf lange Sicht nicht ganz ideal, da es eine direkte Kopplung von der UI (ListBox) zur DB ist. Besser wäre eigene Modell-Klassen zu erzeugen, die per einem Service geladen werden und diese Modell-Instanzen dann an das UI gebunden werden.
So hast du es später leichter, falls es Änderungen gibt. Zudem ist der Code so testbarer (Unit-Tests, etc.).
Wenns eine WPF Anwendung ist, so siehe [Artikel] MVVM und DataBinding

60 Positionen mit jeweils 3 Angaben habe

Gut für so geringe Datenmengen ist SQL Server vllt. etwas überdimensioniert.

Da kannst du schon XML nehmen und per Deerialisierung in den Speicher laden um dort die Manipulationen vornehmen, dann per Serialisierung wieder ins Dateisystem schreiben.
Wegen FTP: beachte aber dass es bei diesem Vorgehen keinen (echten) Schutz vor Mehrbenutzerzugriffen / Races gibt. D.h. die Änderung die Benutzer A macht, können von Benutzer B leicht überschrieben werden. "Echte" DBs bieten hier Möglichkeiten an das handzuhaben.
Stellt das kein Problem dar, so nimm einfach XML.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

T
2.219 Beiträge seit 2008
vor 4 Jahren

@AceTecNic
Wenn die DB der Anwendung lokal sein soll, also nicht zwischen X Anwendungen geteilt wird, würde ich Sqlite anstelle von Xml setzen.

Wenn du aber eine zentrale Datenbank brauchst für X Anwendungen, solltest du später auch einen DB Server setzen und die Daten per Webservice abfragen und nur noch anzeigen.

Xml Dateien als Datenquelle würde ich wenn möglich meiden.
Bei kleinen und lokalen Lösungen mag es noch okay sein, sobald es aber um geteilte Daten oder größere Datenmengen geht, ist das unperformant und durch geteilten Zugriff problematisch.

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.

A
AceTecNic Themenstarter:in
51 Beiträge seit 2018
vor 4 Jahren

Danke für eure Anteilnahme! 🙂

@gfoidl
Hatte mir das ganze so gedacht:
in der Hauptform ist eine Listbox (oder ähnlich) in der mir die Daten angezeigt werden.
Mittels der BearbeitenForm kann ich die Liste bearbeiten, also hinzufügen und entfernen bzw. nur einen Parameter bearbeiten. (Mittelfristig dachte ich an eine Art Passwortabfrage, da aber auf die Liste nur ab und zu zugegriffen wird von max 2-3 Personen seh ich das nicht so eng. Zudem sind es keine Sensiblen Daten 🙂 )

@T-Virus
Mit der DB hatte ich mich gestern Abend mal bissl auseinander gesetzt. (Microsoft SQL Server)
Da das aber ein riesiges Thema ist schieb ich das noch ein Wenig. Zudem ich die DB auf meinem rootserver haben möchte und nicht nur Lokal. Problem ist, ich muss die Daten an Ort A überwiegend eingeben und an Ort B eigentlich nur abrufen bzw. einsehen können.
Das die Variante mit XML nicht die perfekte ist denk ich mir auch. Allerdings für mich als totalen einsteiger ist das schon ein großes Projekt 😁 👍

Hab mich mal mit dem XML ein wenig beschäftigt. Ich glaube von der Struktur her komme ich klar. Falls es jemand interessiert hier ist mal ein Beispiel:


<?xml version="1.0" encoding="utf-8" ?>
<Farbtabelle>
  
  <RAL5018>
    <Lagerort>106</Lagerort>
    <Gewicht>14.5</Gewicht>
  </RAL5018>

  <RAL7035>
    <Lagerort>108</Lagerort>
    <Gewicht>8</Gewicht>
  </RAL7035>

  <RAL7016>
    <Lagerort>110</Lagerort>
    <Gewicht>18</Gewicht>
  </RAL7016>

</Farbtabelle>

3.825 Beiträge seit 2006
vor 4 Jahren

Ich habe mich mit XML nie anfreunden können. Inzwischen mache ich alles mit JSON, da kann man komplette Strukturen mit ein paar Befehlen speichern und laden ohne sich um die Dateistruktur kümmern zu müssen. Die Dateistruktur ist in einer Klasse definiert.

Eine Klasse als Beispiel :


public class QuasarFiles
{
	public string filename { get; set; }
	public string directory { get; set; }
	public long size { get; set; }
	public string checksum { get; set; }
	public DateTime created { get; set; }
	public DateTime modified { get; set; }
	public bool download { get; set; }
	public bool overwrite { get; set; }
}

JSON schreiben :


List<QuasarFiles> files = new List<QuasarFiles>();
files.Add(new QuasarFiles()
{
	filename = fn,
	directory = verz,
	size = length
});
string json = JsonConvert.SerializeObject(files, Newtonsoft.Json.Formatting.Indented);
json = json.Replace("\r\n\r\n", "\r\n");
File.WriteAllText(@"...\files.json", json);

JSON lesen :


string json = File.ReadAllText(@"...\files.json");
List<QuasarFiles> files = JsonConvert.DeserializeObject<List<QuasarFiles>>(json);
foreach (QuasarFiles fil in files)
{ ... }

Man braucht die Newtonsoft.Json.dll dazu. Kann man mit NuGet installieren.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

16.807 Beiträge seit 2008
vor 4 Jahren
json = json.Replace("\r\n\r\n", "\r\n");  

.. auch eher aus optischen Gründen, oder?

<Farbtabelle>

  <RAL5018>
    <Lagerort>106</Lagerort>
    <Gewicht>14.5</Gewicht>
  </RAL5018>

  <RAL7035>
    <Lagerort>108</Lagerort>
    <Gewicht>8</Gewicht>
  </RAL7035>

  <RAL7016>
    <Lagerort>110</Lagerort>
    <Gewicht>18</Gewicht>
  </RAL7016>

</Farbtabelle>

Ist im Hinblick der Struktur aber total falsch.
XML Elemente sind aus Software-Sicht Objekte.
Du hast aber sicherlich nicht für jeden RAL-Ton eine eigene Klasse.
Der RAL-Ton ist eine Eigenschaft.

Passend wäre da eher:

<Farbtabelle>

  <Item Type="RAL5018">
    <Lagerort>106</Lagerort>
    <Gewicht Type="Kg">14.5</Gewicht>
  </Item >

</Farbtabelle>

Und durch Attribute kann man auch weitere Values mitgeben (wie zB. ob das Gewicht Kilo ist, oder was die Value aussagen soll).

Ansonsten wie der Lehrer: Sprichste von 14.5 Äpfeln oder Birnen?

A
AceTecNic Themenstarter:in
51 Beiträge seit 2018
vor 4 Jahren

Der Grobe Ansatz passt ja aber? 😃

Wenn ich das in der Form mache:<Item Type="RAL5018">
Dann wäre dem nur <Farbtabelle> übergeordnet und die Werte <Lagerort> und <Gewicht> untergeordnet zu <Item Type="RAL5018">

Versteh ich das so richtig.

Also sollte ich später eine Suchfunktion mit einbinden könnte ich z.b. nach RAL5018 suchen und bekäme die Werte darunter mitgeliefert?

@BerndFfm
Danke für deinen Hinweis, hatte mir JSON auch schon ins Auge gefasst, möchte aber vorerst mal bei XML bleiben. Finde da iwie leichter den Einstieg. Danke 😃

6.911 Beiträge seit 2009
vor 4 Jahren

Hallo,

Suchfunktion mit einbinden könnte ich z.b. nach RAL5018 suchen und bekäme die Werte darunter mitgeliefert?

Ja. Von der Suche bekommst du das Element und damit verbunden sind alle Kinder.
Vorausgestezt unter Suche verstehen wir Linq2Xml, XPath, etc. und keine einfaches string.IndexOf.

  
<Gewicht Type="Kg">14.5</Gewicht>  
  

Ansonsten wie der Lehrer

Wenn schon dann "Masse" und die SI-Präfix "k" klein. SCNR 😃

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

A
AceTecNic Themenstarter:in
51 Beiträge seit 2018
vor 4 Jahren

Ok, da muss ich mich wohl länger mal einlesen...
Hab grad mal etwas nachgeschlagen mit dem Linq2XML, da wird´s mir gleich schwindlig...

Gut ich glaub ich fange mal mit einfacheren Suchfunktionen an, bzw. zuerst muss ich mir das Speichern beibringen sonst gibt es nicht´s zu lesen 😛