![]() |
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:
nur liefert mir alles, was ich versuche, nur müll zurück!
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; die 3 strings extrahiere ich folgendermaßen:
Delphi-Quellcode:
vieleicht seh ich nur etwas nicht! oder meine funktion geht so nicht! ich weis es nicht mehr, was ich machen soll!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]))); mfg matthias |
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:
so dürfte es gehen (ungetestet)
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, ',')); |
Re: string problem
Hi,
du könntest deinen String so zerlegen :
Delphi-Quellcode:
Gruß Der Unwissendeif 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; |
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:
Achtung: Die Routine verhält sich komisch, wenn der String anders aussieht, weil keine Plausibilitätsprüfung eingebaut wurde.
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; |
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: |
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:
"huhu" zurückgeben.
GetTok('hallo:huhu:bye', 2, ':');
Ich hab mal eine ganze reihe solcher funktionen geschrieben, kannst ja hier mal angucken: ![]() |
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 |
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