INI Datei Updaten

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
michael76
Beiträge: 24
Registriert: Fr 18. Dez 2020, 21:56

INI Datei Updaten

Beitrag von michael76 »

Hallo zusammen!

Ich brauche wieder mal einen Dankanstoss, wie ich an eine Sache ran gehen muss.

Ich habe einen Datensatz, den schreibe ich in eine INI. Auslesen ist auch kein Problem.
Jetzt kommt ein zweiter Datensatz dazu. Ist es möglich den einfach an die INI Datei anzuhängen oder muss ich die Datei komplett neu schreiben?
Oder gibt es andere Möglichkeiten Datensätze in eine Datei zu schreiben. Mein Problem ist, das die Anzahl der Datensätze variabel sein muss.

Momentan steh ich auf dem Schlauch, hat einer nen Tipp wonach ich suchen muss?

Viele Grüße
Michael

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 338
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: INI Datei Updaten

Beitrag von Niesi »

Am einfachsten dürfte es sein, die Ini in eine tStringList zu laden { MySL.LoadFromFile( ... ) }, die neuen Daten per MySL.add(' ...'); anzuhängen und wieder zu speichern.
Denke ich jedenfalls ..
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

michael76
Beiträge: 24
Registriert: Fr 18. Dez 2020, 21:56

Re: INI Datei Updaten

Beitrag von michael76 »

Hallo Niesi,

die Funktion kenn ich nicht. Werde ich mir mal anschauen.
Stringlist hört sich für mich nach String an, können da auch Integer und Realwerte einfach gehandelt werden?

Vielen Dank für deine Antwort

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: INI Datei Updaten

Beitrag von MmVisual »

Eine TSTringList ist ein sehr gutes Werkzeug um Texte mit mehreren Zeilen einfach verwalten zu können. Man kann je Zeile ein TObject mit dazu verwenden um z.B, einen Zahlenwert mit zu geben (z.B. ID von einem Datensatz oder eine ganze Datenstruktur).

Ich benötige regelmäßig diese Funktionen:

- Values[]
- IndexOf()
- IndexOfObject()
- Delimiter
- DelimitedText
- StrictDelimiter

Mit dem ganze mit Delimiter kann man sehr einfach eine Text-Zeile im CSV Format in eine Liste mit Text wandeln und wieder zurück.

Du solltest mit diesen Features mal üben / lesen, die helfen ungemein bei der Umsetzung diverser Aufgaben.
Es gibt noch viele Andere Features, das sind jedoch die Wichtigsten die ich so immer wieder brauche.

Und damit TStringList ist auch sehr einfach auf einem Formular sichtbar zu machen, denn immer nur im Arbeitsspeicher zu "vermuten" was da gerade geschieht ist für einen Anfänger mühsam. Verwende das TMemo in einem Formular und die Eigenschaft "TMemo.Lines" ist eine TStringList, die man so direkt nutzen kann und man sieht jede Änderung auf dem Bildschirm. Ideal zum üben/lernen.
EleLa - Elektronik Lagerverwaltung - www.elela.de

michael76
Beiträge: 24
Registriert: Fr 18. Dez 2020, 21:56

Re: INI Datei Updaten

Beitrag von michael76 »

Hi MmVisual,

CSV und StringList hört sich gut an. Ich denke das INI auch das flasche Werkzeug gewesen wäre, kannte aber kein anderes. Ich werde mich da mal einarbeiten.

Vielen Dank!

Mathias
Beiträge: 6210
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: INI Datei Updaten

Beitrag von Mathias »

Ich würde es mit den Ini-Funktionen machen.
https://wiki.freepascal.org/Using_INI_Files/de

Oder gar auf XML umsteigen. Da kannst du jedem DatenSatz ein Item zuweisen. Da kann man problemlos ganz Arrays von Sätzen abspeichern.
https://wiki.freepascal.org/xmlconf
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

charlytango
Beiträge: 845
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: INI Datei Updaten

Beitrag von charlytango »

michael76 hat geschrieben:
So 30. Apr 2023, 07:16
Ich habe einen Datensatz, den schreibe ich in eine INI.
Die Empfehlungen wären treffsicherer, wüssten wir etwas mehr über die Art und Struktur der abzulegenden Informationen die du als "Datensatz" bezeichnest und auch besonders deren Menge.

Klar kommt eine TStringlist dafür in frage. Aber auch ein TIniFile oder ein TMemInifile (mittlerweile mein Favorit für Einstellungsinformationen in mittlerem Umfang) über eine lokale Datenbank (SQLite zB) oder dann auch eine Netzwerkdatenbank.

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: INI Datei Updaten

Beitrag von theo »

Eine Grundfrage ist hierbei, ob du bei jedem Datensatz die Datei updaten willst, oder ob das erst einmal nur im Speicher passiert.
Du kannst eine z.B. Stringlist erst einmal nur im Speicher befüllen und bei Programmende oder sporadisch speichern.
Ein Stringlist kann man nicht nur "teilweise" in die Datei schreiben, sondern nur immer alles.
Bevor diese Frage nicht geklärt ist, kann man keine guten Tipps geben.
Und wie charlytango auch sagt, die erwartete Datenmenge ist auch entscheidend.
Für 50 Datensätze braucht man kein Fass aufmachen, da reicht die Stringlist oder das Ini-File etc.
Es gibt ja auch noch mehr Möglichkeiten, z.B. https://wiki.lazarus.freepascal.org/CsvDocument

michael76
Beiträge: 24
Registriert: Fr 18. Dez 2020, 21:56

Re: INI Datei Updaten

Beitrag von michael76 »

Vielen Dank erstmal für eure vielen Rückmeldungen.
Die Anzahl der Datensätze sind weniger wie 100.
Ein Datensatz schaut ungefähr so aus:

integer id
integer type
integer ticket
real price
sting commet

Mein Gedanke war, das ich in die erste Zeile immer die Anzahl der Datensätze schreibe und darunter die Datensätze eintrage.
Die Datensätze werden immer der Reihe nach geschrieben. Es werden keine gelöscht sondern immer nur hinzugefügt.
Ich müsste also immer die erste Zeile mit der ANzahl updaten und den Datensatz am ende hinzufügen.
Wäre das mit IniFile möglich oder sind doch andere Werkzeuge besser?

Viele Grüße Michael

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: INI Datei Updaten

Beitrag von MacWomble »

Ich hatte für eine Statistikdatenerfassung eine ähnliche Aufgabenstellung. Maximal ca. 500 Datensätze/Quartal mit fortlaufender Nummer und Gesamtzahl.
Hierfür habe ich für die fortlaufende Nummer und die aktuelle Anzahl (und einige andere Sachen) eine INI-Datei verwandt , die Datensätze aber einfach in eine csv-Datei geschrieben. Das schien mir der einfachste Weg für diese Aufgabe und funktioniert reibungslos seit mehreren Jahren. Am Ende des Quartals wird jedoch die CSV bei uns (absichtlich, nach der Auswertung) wieder geleert, so dass die Größe recht konstant ist.
Eine Ini-Datei ist besser geeignet, einzelne, unterschiedliche Datenwerte zu halten. Die Csv hat dafür Vorteile bei sich wiederholenden, Strukturgleichen Datensätzen.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: INI Datei Updaten

Beitrag von wp_xyz »

michael76 hat geschrieben:
So 30. Apr 2023, 20:24
Ich müsste also immer die erste Zeile mit der ANzahl updaten und den Datensatz am ende hinzufügen.
Dafür ist eine Ini-Datei ungeeignet. Eine Ini-Datei besteht aus mehreren [Abschnitten], die in beliebiger Reihenfolge vorliegen können. Wenn du am Ende der Datei etwas anfügten willst, muss der zugehörige Abschnitt am Ende stehen, aber davon kannst du nicht ausgehen, je nachdem wie die Ini-Datei geschrieben wurde.

Wenn es wirklich so wesentlich darauf ankommt, dass immer nur am Ende der Datei angefügt wird (was ich bezweifle), würde ich einfach eine Text-Datei nehmen, die jeden Record als eigene Zeile mit durch Tabulatoren getrennten Felder enthält. Wenn du die Datei mit Append öffnest, kannst du den nächsten Record ans Ende schreiben. Die Zahl der Datensätze würde ich gar nicht reinschreiben, denn sie ergibt sich aus der Anzahl der Zeilen, die du erhältst, wenn du die Datei als ganzes einliesen. Aber schwerwiegender: Wenn du (nach einem zweiten Öffnen der Datei mit Reset) am datei-Anfang schreibst, wirst du Record-Elemente überschreiben, wenn der für die erste zeile reservierte Platz nicht mehr ausreicht. Zum Einlesen selbst würde ich einfach in eine Stringliste einlesen, deren Strings mit Hilfe des Split-Stringhelpers in die einzelnen Elemente aufgetrennt werden können. Oder du kannst auch ganz klassisch die Datei mit Reset öffnen und Zeile für Zeile einlesen

Siehe beigefügtes Beispiel.
Dateianhänge
appendfile.zip
(3.13 KiB) 32-mal heruntergeladen

Benutzeravatar
KodeZwerg
Beiträge: 103
Registriert: Mo 6. Feb 2023, 11:04

Re: INI Datei Updaten

Beitrag von KodeZwerg »

Da ich ein strikter gegner von low level bin, hab ich mal eine stream variante angeheftet die unendlich viele "pakete" ablegen kann.
Es wird ein array of records geladen oder gespeichert.
Viel spaß und einen schönen ersten Mai :lol:
Dateianhänge
StreamRecord.zip
(1.67 KiB) 36-mal heruntergeladen
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

michael76
Beiträge: 24
Registriert: Fr 18. Dez 2020, 21:56

Re: INI Datei Updaten

Beitrag von michael76 »

Hallo!

Vielen Dank für die Beispiele. Ich denke daraus kann ich mir etwas passendes ableiten!

Einfach TOP was für wissen ihr habt.

Grüße Michael

Antworten