Entwickler-Ecke
Dateizugriff - Textzeilen sollen bestimmte ID's bekommen
arminho - Do 19.06.08 19:50
Titel: Textzeilen sollen bestimmte ID's bekommen
hallo leute,
ich komme zur zeit bei mir nicht wirklich weiter, da ich nicht weiß wie man das umsetzen kann.
unswar habe ich ein .txt-File in welches Daten reingeschrieben werden können, von dort wieder abgerufen werden und bearbeitet bzw. gelöscht etc. werden können.
ich möchte jeder zeile dieses .txt-Files eine Erkennung zuweisen, sodass ich später einfach mit dem bennenen der Erkennung die entsprechende Zeile abrufen kann.
Zeile 1 soll z.B. ID 1 haben, Zeile 2 ID 2 etc.
am liebsten wäre es mir wenn er mir automatisch die Erkennung vergibt, sobald eine neue Zeile dazugefügt wird.
Ich möchte hier auch keinen fertigen Code oder so, sondern nur mal wissen mit welcher Methode bzw. Befehlen das zu realisieren wäre, da ich echt nicht weiter weiß.
danke euch für eure Hilfe
Narses - Do 19.06.08 20:25
Titel: Re: Textzeilen sollen bestimmte ID's bekommen
Moin!
arminho hat folgendes geschrieben: |
ich möchte jeder zeile dieses .txt-Files eine Erkennung zuweisen, sodass ich später einfach mit dem bennenen der Erkennung die entsprechende Zeile abrufen kann.
Zeile 1 soll z.B. ID 1 haben, Zeile 2 ID 2 etc.
am liebsten wäre es mir wenn er mir automatisch die Erkennung vergibt, sobald eine neue Zeile dazugefügt wird. |
Also mit Automatik bei einer Text-Datei sehe ich da ziemlich schwarz :?
Ansatz: :idea:
- NextID: Cardinal :arrow: Autoincrement-Zähler, bei Programminstallation/Inbetriebnahme auf 0 setzen und in jeder Sitzung auf den letzten Wert wiederherstellen
- StringListe anlegen, Textdatei reinladen
- Format der Textdatei: die ersten 8 Zeichen sind die Hexdarstellung der Zeilen-ID, abtrennen und mit StrToInt64('$'+Copy(SL.Strings[i],1,8 )) in dem Object dieser Zeile ablegen :arrow: das ist die Zeilen-ID
- beim Anlegen neuer Zeilen den Autoincrement-Index als zugehöriges Object ablegen, dann eins draufzählen
- Suchen einer ID in der Liste: .IndexOfObject()
- Vorm Speichern das Object mit IntToHex(Cardinal(SL.Objects[i]),8 ) vorne an den String anfügen
cu
Narses
hansa - Fr 20.06.08 00:17
Mann, mann, was soll denn das werden ? Wegen so etwas noch mit Objekten etc. rumfummeln ? :shock: schreibe die Zeilennummern an den Beginn jeder Zeile und fertig. Den Rest macht man mit copy. 8)
Narses - Fr 20.06.08 11:39
Moin!
hansa hat folgendes geschrieben: |
Mann, mann, was soll denn das werden ? Wegen so etwas noch mit Objekten etc. rumfummeln ? |
Wie mit Objekten rumfummeln? :nixweiss: Einfach die Zeilen-ID per Pointer()-Typecast da ablegen, wo sowieso Platz dafür ist. ;)
hansa hat folgendes geschrieben: |
schreibe die Zeilennummern an den Beginn jeder Zeile und fertig. Den Rest macht man mit copy. 8) |
Aha, und das Problem mit der Zahlenlänge im String? Das ist doch wohl in meinem Vorschlag besser gelöst... :D (eben outband 8))
cu
Narses
Tilman - Fr 20.06.08 13:02
@arminho beschreib doch mal was du in etwa mit deinem Programm anstellen willst. Möglicherweise gibt es ja auch noch einfachere Lösungen.
baka0815 - Fr 20.06.08 13:52
Wenn du das machen möchtest, was ich vermute, könntest du dir mal die Datenbank
SQLite [
http://www.sqlite.org/] angucken.
hansa - Fr 20.06.08 14:20
Narses hat folgendes geschrieben: |
Aha, und das Problem mit der Zahlenlänge im String? Das ist doch wohl in meinem Vorschlag besser gelöst... :D (eben outband 8)) |
Narses, Objects sind ja schön und gut. Ich bin ja schon froh, wenn einer überhaut weiß, dass es so was gibt. Wieso ist die Zahlenlänge im String ein Problem ? Du meinst 1 ist kleiner als 99999 oder wie ? :shock: Die muss an den Anfang des Strings und zwar rechtsbündig. Die Stringliste wäre dann mit solchen Sachen gefüllt (5-stellige Zahlen) :
Delphi-Quelltext
1: 2:
| 1sldlaffdaflfdla 99999abc |
Da wären alle Informationen enthalten, die er braucht. Natürlich braucht man noch einen Hilfsstring für den reinen String-Inhalt. Dafür reicht :
Delphi-Quelltext
1:
| HilfSt := copy (6,length (sl.strings[i]); |
Um diese eine Zahl pro Zeile zu verwalten braucht man dann nicht mehr Objects erzeugen und wieder freigeben etc. Man hätte ja dann auch quasi 2 Listen : einmal die Stringlist selber und dann noch die Liste der Objekte. Nene, wenn schon dann umgekehrt. Man nehme eine TObjectList mit folgenden Elementen :
Delphi-Quelltext
1: 2: 3: 4:
| MeinObjekt = class(TObject) nr : integer; st : string; end; |
Für die Liste soll er OwnsObjects auf true setzen und fertig.
Narses - Fr 20.06.08 14:30
Moin!
hansa hat folgendes geschrieben: |
Narses, Objects sind ja schön und gut. Ich bin ja schon froh, wenn einer überhaut weiß, dass es so was gibt. |
hansa, du hast meinen Post nicht verstanden... 8)
hansa hat folgendes geschrieben: |
Wieso ist die Zahlenlänge im String ein Problem ? Du meinst 1 ist kleiner als 99999 oder wie ? :shock: Die muss an den Anfang des Strings und zwar rechtsbündig. |
Das ist sie bei mir auch, aber dafür über den vollen Wertebereich von
Cardinal und noch dazu effizienter codiert (hex). :idea:
hansa hat folgendes geschrieben: |
Um diese eine Zahl pro Zeile zu verwalten braucht man dann nicht mehr Objects erzeugen und wieder freigeben etc. |
Das habe ich auch nicht vorgeschlagen, sonden das zugeordnete
.Objects[] eines
.Strings[] in einer TStringList als Speicher für die Zeilen-ID zu "missbrauchen" (
Typecast auf
Pointer(), du erinnerst dich sicher an meine erste Erwähnung weiter oben, oder? 8)).
:think:
cu
Narses
hansa - Fr 20.06.08 14:47
Titel: Re: Textzeilen sollen bestimmte ID's bekommen
Narses hat folgendes geschrieben: |
Format der Textdatei: die ersten 8 Zeichen sind die Hexdarstellung der Zeilen-ID, abtrennen und mit StrToInt64('$'+Copy(SL.Strings[i],1,8 )) in dem Object dieser Zeile ablegen :arrow: das ist die Zeilen-ID
|
Ne, Narses ich verstehe wirklich nicht, was Du da vor hast. Echt nicht ! :mrgreen:
Was hat denn da überhaupt Hex zu suchen ? Du willst ja selber die ersten 8 Stellen der Strings für die Zeilennr. "missbrauchen". Was sollen denn jetzt da noch die Objects ? :gruebel:
Narses - Fr 20.06.08 15:18
Titel: Re: Textzeilen sollen bestimmte ID's bekommen
Moin!
hansa hat folgendes geschrieben: |
Ne, Narses ich verstehe wirklich nicht, was Du da vor hast. Echt nicht ! |
:roll: ;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| var SL: TStringList; AutoCount: Cardinal = 0; i: Integer;
begin SL := TStringList.Create;
SL.LoadFromFile('C:\Test.txt'); for i := 0 to SL.Count-1 do begin SL.Objects[i] := Pointer(StrToInt64(Copy(SL.Strings[i],1,8))); SL.Strings[i] := Copy(SL.Strings[i],9,Length(SL.Strings[i])-8); end;
SL.AddObject('Neuer Eintrag',Pointer(AutoCount)); Inc(AutoCount);
for i := 0 to SL.Count-1 do SL.Strings[i] := IntToHex(Integer(SL.Objects[i]),8) +SL.Strings[i]; SL.SaveToFile('C:\Test.txt'); SL.Free; |
cu
Narses
Sirke - Fr 20.06.08 15:31
Warum nimmt man nicht einfach eine StringList und gut ist? Dort ist jeder Zeile eine Nummer zugeordnet also kann jede Zeile eindeutig Identifiziert werden und es gibt die entsprechenden Befehle zum Anfügen, Ändern und Löschen!
Kann mir vorstellen, dass arminho vorher nur mit einen Stringgearbeitet hatte und die TStringList gar nicht kannte!
Narses - Fr 20.06.08 15:39
Moin!
Sirke hat folgendes geschrieben: |
Warum nimmt man nicht einfach eine StringList und gut ist? Dort ist jeder Zeile eine Nummer zugeordnet also kann jede Zeile eindeutig Identifiziert werden und es gibt die entsprechenden Befehle zum Anfügen, Ändern und Löschen! |
Das klappt nur so alleine nicht, weil dann die Zeilen keine
eindeutige Kennung haben, sondern nur einen
relativen Index. Wenn du z.B. eine Zeile löscht oder einfügst, dann kannst du ein Indexproblem bekommen, wenn du dir "ausserhalb" eine Zeile merken möchtest. :idea:
cu
Narses
hansa - Fr 20.06.08 15:44
Vermutlich reicht die Stringliste alleine schon. Ich habe ja auch eigentlich nur wegen Narses Beitrag geantwortet. Also wegen seiner Objects/Pointer/Hex-Orgie. :mrgreen: @Narses : warte mal auf den Fragesteller. Wir diskutieren über ungelegte Eier.
Narses - Fr 20.06.08 15:49
Moin!
hansa hat folgendes geschrieben: |
Vermutlich reicht die Stringliste alleine schon. |
Das kann nicht sein, wenn der Fragesteller seine Frage korrekt gestellt hat. ;)
hansa hat folgendes geschrieben: |
Ich habe ja auch eigentlich nur wegen Narses Beitrag geantwortet. Also wegen seiner Objects/Pointer/Hex-Orgie. :mrgreen: @Narses : warte mal auf den Fragesteller. Wir diskutieren über ungelegte Eier. |
Ich "diskutiere" nicht mit dem Fragesteller, sondern gebe dir grade Nachhilfe... :mrgreen:
cu
Narses
hansa - Fr 20.06.08 16:02
Sei bloß ruhig. Du mit Deiner Pointer-Objects-Hex-Stringliste. :mrgreen:
FinnO - So 22.06.08 22:09
irgendwie raff ichs grad nicht :D also ich mach son kack immer mit ner Stringlist :D
dann hab ich die Zeilen fein Säuberlich...
Timosch - So 22.06.08 22:27
FinnO hat folgendes geschrieben: |
irgendwie raff ichs grad nicht :D also ich mach son kack immer mit ner Stringlist :D
dann hab ich die Zeilen fein Säuberlich... |
Hier geht es aber um absolute Kennungen. Wenn du in einer Stringlist, die bisher 2 Zeilen hat, eine weitere einfügst, dann ist die Nummer 3. Wenn du aber davor noch eine einfügst, wird aus 3 plötzlich 4. Hier wird ein unveränderlicher Identifier gesucht. (wenn ich diesen String-Pointer-Object-Hex-Integer-Streit verstanden habe :mrgreen: )
FinnO - Mo 23.06.08 21:23
okay - dann macht die geschichte sinn
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!