Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   string problem (https://www.delphipraxis.net/57842-string-problem.html)

Matthias-k 27. Nov 2005 14:27


string problem
 
hi leutz!

ich steck grad in ner denkklemme!

und zwar folgendes problem: ich habe einen string, in etwa dem gleich:

test -> art : test2, beschichtet, mat.765

jetzt brauch ich die 3 entscheidenden teile:

test
test2, beschichtet
mat.765

das erste habe ich! (indem ich per pos den pfeil suche)
das 2. klappt noch net und des 3. och net!

beim dritten liegt das problem an evtl 2 vorhandenen kommas! weil ich brauch immer das letzte komma! hab mir deshalb
fix ne funktion geschrieben, welche das erledigt!

Delphi-Quellcode:
function LastPos(str,delemiter : string): integer;
var
  a : integer;
begin
  a := 0;
  for a := length(str) downto 0 do
  begin
    if str[a] = delemiter then
      result := a
    else
      result := 0;
  end;
end;
nur liefert mir alles, was ich versuche, nur müll zurück!

die 3 strings extrahiere ich folgendermaßen:

Delphi-Quellcode:
   
hG := trim(copy(strgtest.Cells[0,4], 0, pos('->', strgtest.Cells[0,4]) - 1));
G := trim(copy(strgtest.Cells[0,4], pos(':', strgtest.Cells[0,4]), LastPos(strgtest.Cells[0,4],',')));
w := trim(copy(strgtest.Cells[0,4], LastPos(strgtest.Cells[0,4], ','), length(strgtest.Cells[0,4])));
vieleicht seh ich nur etwas nicht! oder meine funktion geht so nicht! ich weis es nicht mehr, was ich machen soll!

mfg matthias

Pseudemys Nelsoni 27. Nov 2005 14:51

Re: string problem
 
Delphi-Quellcode:
function GetTok(const Str: string; const Idx: Integer; const Sep: Char): string;
var
  StrLen: Integer;
  StrIdx: Integer;
  ResLen: Integer;
  TokIdx: Integer;
begin
  Result := '';
  if Idx > 0 then
  begin
    StrLen := Length(Str);
    SetLength(Result, StrLen);
    ResLen := 0;
    TokIdx := 0;
    for StrIdx := 1 to StrLen do
    begin
      if (Str[StrIdx] <> Sep) and ((StrIdx = 1) or (Str[StrIdx-1] = Sep)) then
        Inc(TokIdx);
      if TokIdx > Idx then
        Break
      else if (TokIdx = Idx) and (Str[StrIdx] <> Sep) then
      begin
        Inc(ResLen);
        Result[ResLen] := Str[StrIdx];
      end;
    end;
    SetLength(Result, ResLen);
  end;
end;
Delphi-Quellcode:
hG := Trim(GetTok(strgtest.Cells[0,4], 1, '-'));
G := Trim(GetTok(GetTok(strgtest.Cells[0,4], 2, ':'), 1, ','));
w := Trim(GetTok(GetTok(strgtest.Cells[0,4], 2, ':'), 2, ','));
so dürfte es gehen (ungetestet)

Der_Unwissende 27. Nov 2005 14:53

Re: string problem
 
Hi,
du könntest deinen String so zerlegen :

Delphi-Quellcode:
 
  if Pos('->', str) > 0 then
    begin
      hg := trim(copy(str, 1, Pos('->', str) - 1));
    end;
  if Pos(':', str) > 0 then
    begin
      G := trim(copy(str, Pos(':', str) + 1, LastDelimiter(',', str) - Pos(':', str) - 1));
    end;
  if Pos(',', str) < LastDelimiter(',', str) then
    begin
      w := trim(copy(str, LastDelimiter(',', str) + 1, length(str) - LastDelimiter(',', str) - 1));
    end;
Gruß Der Unwissende

alzaimar 27. Nov 2005 15:00

Re: string problem
 
Knapp vom Unwissenden geschlagen, aber als Alternative taugst allemal:
Du musst den String so aufteilen:
1.Teil: Alles vor dem '->'
3.Teil: Alles ab dem LETZTEN Komma
2.Teil Alles zwischen 1.Teil und 3.Teil, aber ohne die Trenner.

Beim 2.Teil noch "art : " vorne abschneiden (also 6 Zeichen).
Na, das ist doch einfach:
Delphi-Quellcode:
Procedure MatthiasSeinStringAufteiler (Const aStr : String; Var Teil1, Teil2, Teil3 : String);
// Teilt einen String BLA->art : FOO,BAR in die 3 Teile BLA, FOO und BAR
Var
  i,j : Integer;
Begin
  i := Pos ('->',aStr);
  Teil1 := Trim (Copy (aStr,1,i-1));
  inc (i,2); // i steht jetzt auf dem 'a' von 'art : FOO'
  Inc (i,6); // wenn immer'art : ' da steht, also 6 Zeichen, einfach rüberhüpfen
  j := Length (aStr);
  While aStr[j]<>',' do dec (j); // Letztes Komma suchen
  Teil2 := Trim (Copy (aStr, i, j-i));
  Teil3 := Trim (Copy (aStr, j+1, maxint));
End;
Achtung: Die Routine verhält sich komisch, wenn der String anders aussieht, weil keine Plausibilitätsprüfung eingebaut wurde.

Matthias-k 27. Nov 2005 15:09

Re: string problem
 
@Pseudemys Nelsoni

kannst du mal ein paar erklärungen zu dieser procedure machen? wieso würdest du das auf diese weise lösen?


@der_unwissende

thx!


@alzaimar

so etwas in der art war mir auch schon vorgeschwebt! allerdings hat die umsetzung heut en klein wenig fehgeschlagen!



die lösung von dem unwissenden (is ein unpassender name in dieser meiner situation! eigentlich würde der besser zu mir passen!) funktioniert wjedenfalls einwandfrei!

danke nochmal!

matthias

p.s.: MatthiasSeinStringAufteiler???? geiler name! *ggg* sollt ich mal wirklich in das programm übernehmen! mal sehn, was die anderen meinen! *ggg*

:dp:

Pseudemys Nelsoni 27. Nov 2005 15:14

Re: string problem
 
Die prozedur(die benutz ich generell oft zum parsen) holt einen token(teilstring getrennt durch einen seperator) anhand des indexes. als beispiel:

wenn dein string so aussieht: hallo:huhu:bye

dann würde dir:

Delphi-Quellcode:
GetTok('hallo:huhu:bye', 2, ':');
"huhu" zurückgeben.


Ich hab mal eine ganze reihe solcher funktionen geschrieben, kannst ja hier mal angucken:

http://www.delphipraxis.net/internal...ct.php?t=62743

Matthias-k 27. Nov 2005 15:20

Re: string problem
 
funktioniert aber bei mir nicht! weil kein eindeutiger delemiter verwendet wird!

beim ersten ist es ein '->' und beim letzen ein komma!

also hallo->huhu,bye

das düfte deine funktion etwas verwirren! wenn man allerdings deine funktion so erweitert, das sie mehrere delemiter auf einmal erfassen und sortieren könnte, wär das ding riesig!

matthias

Pseudemys Nelsoni 27. Nov 2005 15:25

Re: string problem
 
hallo matthias,

ich erweiter die unit zwar gerade(unabhängig von diesem thread ;)) aber probier doch einfach mal mein beispiel...du hast zwar mehrere trenner, aber du kannst ja "gettok" auch mehrfach verwenden, also verschachtelt ;)

Delphi-Quellcode:
const s: string = 'huhu->blubb:bye';
var
  Wort1, Wort2, Wort3: string;
begin
  Wort1 := GetTok(s, 1, '-');
  Wort2 := GetTok(GetTok(s, 2, '>'), 1, ':');
  Wort3 := GetTok(GetTok(s, 2, '>'), 2, ':');
end;
;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 Uhr.

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