AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

string problem

Ein Thema von Matthias-k · begonnen am 27. Nov 2005 · letzter Beitrag vom 27. Nov 2005
Antwort Antwort
Matthias-k

Registriert seit: 7. Jul 2005
Ort: Freiberg
75 Beiträge
 
Delphi 7 Professional
 
#1

string problem

  Alt 27. Nov 2005, 14:27
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


Gebt Trollen keine Chance!!!
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#2

Re: string problem

  Alt 27. Nov 2005, 14:51
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)
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#3

Re: string problem

  Alt 27. Nov 2005, 14:53
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: string problem

  Alt 27. Nov 2005, 15:00
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Matthias-k

Registriert seit: 7. Jul 2005
Ort: Freiberg
75 Beiträge
 
Delphi 7 Professional
 
#5

Re: string problem

  Alt 27. Nov 2005, 15:09
@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*



Gebt Trollen keine Chance!!!
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#6

Re: string problem

  Alt 27. Nov 2005, 15:14
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:

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
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Matthias-k

Registriert seit: 7. Jul 2005
Ort: Freiberg
75 Beiträge
 
Delphi 7 Professional
 
#7

Re: string problem

  Alt 27. Nov 2005, 15:20
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


Gebt Trollen keine Chance!!!
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#8

Re: string problem

  Alt 27. Nov 2005, 15:25
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;
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 Uhr.
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