letzte Leerzeichen im String finden und splitten

22. Januar 2020 17:20

Hallo MSDynamics,

da ich noch relativ neu in Navision bin, bräuchte ich eure Hilfe.

Wie kann ich in einem String, das letzte Leerzeichen finden und dort einen Split machen, bzw. den String dort zerteilen?

LG

Re: letzte Leerzeichen im String finden und splitten

22. Januar 2020 19:00

Worauf du hinaus willst ist

Code:
ErsterString := CopyStr(OrgString, 1, LastStrPos(...));
ZweiterString := CopyStr(OrgString, LastStrPos(...));


und "LastStrPos(...)" könnte zbsp so aussehen:
Code:
    procedure LastStrPos(String: Text; SubStr: Text): Integer
    var
        Char: Text;
    begin
        while StrLen(String) > 0 do begin
            Char := CopyStr(String, StrLen(String) - ( StrLen(SubStr) - 1), StrLen(SubStr));

            if Char = SubStr then
                exit(StrLen(String) - ( StrLen(SubStr) - 1));

            String := CopyStr(String, 1, StrLen(String) - 1);

            if StrLen(String) = 1 then
                String := '';
        end;
        exit(0);
    end;


würde dann also darauf hinauslaufen:
Code:
ErsterString := CopyStr(OrgString, 1, LastStrPos(OrgString, ' '));
ZweiterString := CopyStr(OrgString, LastStrPos(OrgString, ' '));


Allerdings solltest du beachten:
* Was ist wenn kein Leerzeichen vorhanden ist?
* Was ist wenn nach dem teilen der Erste String immer noch zu lang ist?

Re: letzte Leerzeichen im String finden und splitten

22. Januar 2020 20:08

Hallo,

eine Lösung, die mit der maximalen Länge umgehen können sollte:
Code:
procedure SplitLastBlank(String: Text; SplitLen:Integer,VAR SubStrArr : ARRAY [10] OF Text): ArrIndex:Integer
var
  CopyStartPos : integer;
  CopyText : Text;
begin
  CLEAR(SubStrArr);  // damit wir keinen Müll zurückliefern
  String := DELCHR(String,'<'); // Wenn Blanks am Anfang gewünscht sind, dann diese Zeile weg lassen, kann aber zu unerwünschten Leerzeilen führen
  WHILE (String <>'') DO BEGIN
    ArrIndex += 1;                                  // in SubStrArr[ArrIndex] kommt der nächste Text
    CopyText := copystr(String,1,Splitlen);         // wir nehmen erst mal alles was in ein Feld rein geht (oder weniger)
    if strlen(CopyText) < Splitlen THEN BEGIN       // String enthält weniger als die max. Feldlänge (war der Rest)
      SubStrArr[Arrindex] := DELCHR(Copytext,'>');  // fügt den Resttext in das Array ein.
      String := '';                                 // den Resttext aus String löschen, damit wir aus der Schleife raus kommen
    END ELSE BEGIN
      CopyStartpos := Splitlen;                     // ab da +1 haben wir vor, den Rest aus String weiter zu benutzen
      WHILE (CopyText[CopyStartPos]<> ' ') and (CopyStartPos>1) DO // wir suchen nach dem letzten Blank
       CopyStartPos -=1;
      if (CopyStartPos = 1 ) THEN                   // war kein Blank drin, dann nehmen wir alles
        CopyStartpos := Splitlen;
      SubStrArr[Arrindex] := DELCHR(copystr(Copytext,1,CopyStartpos),'>');
                                                    // fügt den Text bis zum letzen Blank ohne anhängende Blanks ein
      String := DELCHR(copystr(String,CopyStartPos+1),'<');     
                                   // wir nehmen den Rest hinter dem aktuellen Text und laufen damit die Schleife erneut durch, falls noch was drin ist.
                                   // Wenn Blanks am Anfang gewünscht sind, dann den DELCHR weg lassen, kann aber zu unerwünschten Leerzeilen führen
    END;
  END;
  // Als Returnwert bekommen wir dann die Anzahl der Felder
end;


EDIT:Was jetzt noch zu prüfen ist, wie man damit umgeht, wenn man nur zwei Zeilen hat, der Text aber nach dem Aufteilen nicht in zwei Zeilen passt (zweite Zeile zu lang).

Re: letzte Leerzeichen im String finden und splitten

23. Januar 2020 09:47

Oder so: Letztes Leerzeichen im String finden