Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi string zerlegen (https://www.delphipraxis.net/105491-string-zerlegen.html)

newuser01 22. Dez 2007 23:02


string zerlegen
 
Delphi-Quellcode:
sl_e.LoadFromStream(Temp);

sl_TMP.StrictDelimiter := true;
sl_TMP.Delimiter := '#';

for a := 0 to sl_e.Count - 1 do
begin
  sl_tmp.DelimitedText := sl_e.Strings[a];

    for b := 1 to sl_tmp.Count - 1 do
    begin
      s := s + ' ' + sl_e.Strings[0];
    end;

  re_a.Lines.Add(s);
  sl_tmp.Clear;
  s := '';
end;
Nach dem Durchlauf ist in re_a-Lines.Strings[Count - 1] (letzte Eintrag) nur noch folgender String drin :-)

D: { 59789999999999 { 555aaa666bbb777ccc }}

Ich möchte jetzt aus diesem String, nur noch den Wert 555aaa666bbb777ccc rausholen und einer Variable übergeben. Dieser Wert ist immer anders! Das einzige was immer gleich ist sind die Klammern "{" und "}}" sowie das "D:" Ich weis das man dies mit "pos" und "copy" lösen könnte aber ich stoß dabei an meine Grenzen :-) Vielleicht könnt ihr ja ein wenig helfen:-)

inherited 22. Dez 2007 23:11

Re: string zerlegen
 
Delphi-Quellcode:
NewString := Copy(OldString, PosEx('{', OldString, Pos('{', OldString)+1), Length(OldString));
NewString := Copy(NewString,1, Length(NewString)-3);
Vermutlich kommt es so nicht ganz hin, ist ungetestet, musst noch ein wenig mit rumexperimentieren. PosEx ist in der Unit StrUtils, die musst du noch einbinden.

Bastler 22. Dez 2007 23:18

Re: string zerlegen
 
Also die richtigen Ansätze hast Du dir selber schon gegeben :-D

Ich weiß nur nicht, wo man bei copy eine Grenze haben kann

Zitat:

function Copy(S; Index, Count: Integer): string;
Also doch einfach bei diesem String:
Zitat:

D: { 59789999999999 { 555aaa666bbb777ccc }}
Delphi-Quellcode:
copy('D: { 59789999999999 { 555aaa666bbb777ccc }}',23,18);
bzw. bei dir ja ehr:
Delphi-Quellcode:
copy(re_a-Lines.Strings[Count - 1],23,18);
Ich hoffe, ich habe mich nicht verzählt bei Count und Index, falls doch vergib' mir bitte um diese Uhrzeit...

mfg Bastler

P.S.: Falls diese Nummer "59789999999999" nich immer die gleiche Länge hat, musst du den Beginn des relevanten Terms durch eine If-Bedingung und den geschweiften Klammern feststellen...
falls es dazu Fragen gibt, einfach nochmal posten...

Bastler 22. Dez 2007 23:19

Re: string zerlegen
 
:? mist zu langsam... naja kommt ja auch das gleiche hinaus...

OT: Warum wurde ich nicht drauf hingewiesen vor dem Abschicken? ist das Script ausgeschaltet/kaputt?

bitsetter 22. Dez 2007 23:20

Re: string zerlegen
 
Da es nicht mal in Delphi 6 die Funktion PosEx gibt hier noch eine andere Variante.
Delphi-Quellcode:
var
  LPos, Rpos: word;
begin
  //st= 'D: { 59789999999999 { 555aaa666bbb777ccc }}';
  LPos:= LastDelimiter('{', st);
  Rpos:= Pos('}}', st);
  caption:= Copy(st, Lpos+ 2, Rpos- LPos- 3);

newuser01 22. Dez 2007 23:37

Re: string zerlegen
 
Zitat:

Da es nicht mal in Delphi 6 die Funktion PosEx gibt hier noch eine andere Variante.
Benutze zur Zeit "Turbo Delphi" (free) sollte ich wohl mal in mein Profil ändern :-)


"inherited" dein Code klappt bestens hier die Änderungen noch

Delphi-Quellcode:
sOld := re_a-Lines.Strings[Count - 1];
sNew := Copy(sOld, PosEx('{', sOld, Pos('{', sOld)+1), Length(sOld));
sNew := Copy(sNew,3, Length(sNew)-6);

Jetzt erhalte ich exakt 555aaa666bbb777ccc ohne Leerzeichen am Ende oder sonstiges, nur verstehen tu ich den Code nicht ganz. Vielleicht könntet ihr ihn Schritt für Schritt verständlich Dokumentieren.

Matze 23. Dez 2007 08:40

Re: string zerlegen
 
Moin,

man kann das auch ein wenig übersichtlicher schreiben (ich hoffe, ich vertu mich da nicht):

Delphi-Quellcode:
// Position der 1. '{':
geschwKlammerAuf1 := Pos('{', OldString);

// Position der 2. '{' (gesucht wird ab dem Folgeindex der 1. '{'):
geschwKlammerAuf2 := PosEx('{', OldString, geschwKlammerAuf1 + 1);

// Kopiert die Zeichen ab der 2. '{' bis zum Stringende:
NewString := Copy(OldString, geschwKlammerAuf2, Length(OldString));

// Kopiert die Zeichen vom Anfang des Strings bis zum drittletzten Zeichen:
NewString := Copy(NewString, 1, Length(NewString)-3);
Wobei man die letzten beiden Code-Zeilen auch zusammenfassen könnte zu:

Delphi-Quellcode:
NewString := Copy(OldString, geschwKlammerAuf2, Length(OldString) - 3);
wenn ich das richtig sehe. Hab's aber nicht getestet.

Grüße

grenzgaenger 23. Dez 2007 09:54

Re: string zerlegen
 
aber sag mal, weshalb nimmste nicht die funktion von bitsetter? die funktioniert ja auch unter D5

Delphi-Quellcode:
function LastString(aSTring: pChar; aLeftDelimiter, aRightDelimiter: string): string;
begin
  result := ''; //Rückgabewert Leerstring, falls Fehler aufgetreten
  inc(aString, LastDelimiter(aLeftDelimiter, aString));
  result := trim(copy(aString, 1, pos(aRightDelimiter, aString)-1));
end;
Aufruf:
Delphi-Quellcode:
DeinZielString := LastString('D: { 59789999999999 {555aaa666bbb777ccc}}', '{', '}');

marabu 23. Dez 2007 10:43

Re: string zerlegen
 
Hallo,

sogar die interne Zerlegung älterer StringList-Implementierungen erledigt das:

Delphi-Quellcode:
function ExtractField(const s: string; index: Integer): string;
begin
  with TStringList.Create do
  try
    CommaText := s;
    Result := Strings[index];
  finally
    Free;
  end;
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
begin
  ShowMessage(ExtractField('D: { 59789999999999 { 555aaa666bbb777ccc }}', 4));
end;
Frohe Weihnachten

newuser01 23. Dez 2007 11:22

Re: string zerlegen
 
Zitat:

aber sag mal, weshalb nimmste nicht die funktion von bitsetter? die funktioniert ja auch unter D5
Ich benutze fast nur noch Turbo Delphi die kostenlose Version. Wie bereits gesagt sollte ich mal im Profil ändern :-)
----------------------------------------------------------------------------------------------------------------------

Ein Danke an "Matze" für die Erklärung und auch ein Dank an allen anderen die geholfen haben.


Ich wünsche euch noch eine frohe Weihnacht :) und ein guten Rutsch ins neue Jahr


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz