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!

user profile iconarminho 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: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!

user profile iconhansa 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. ;)

user profile iconhansa 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

user profile iconNarses 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!

user profile iconhansa 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.
user profile iconhansa, du hast meinen Post nicht verstanden... 8)

user profile iconhansa 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:

user profile iconhansa 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
user profile iconNarses 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!

user profile iconhansa 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;

  // Datei laden
  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;

  // neuen Eintrag anlegen
  SL.AddObject('Neuer Eintrag',Pointer(AutoCount));
  Inc(AutoCount);

  // Datei speichern
  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!

user profile iconSirke 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!

user profile iconhansa hat folgendes geschrieben:
Vermutlich reicht die Stringliste alleine schon.
Das kann nicht sein, wenn der Fragesteller seine Frage korrekt gestellt hat. ;)

user profile iconhansa 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

user profile iconFinnO 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