Doppelte Leerzeichen im String entfernen

3. Mai 2017 15:48

Hallo zusammen,

ich möchte gerne (wie der Titel schon sagt) doppelte Leerzeichen in Strings entfernen lassen. Das Problem ist zur Zeit, dass anscheinend in einigen Artikelbeschreibungen doppelte und dreifache Leerzeichen enthalten sind. Nicht am Anfang oder am Ende eines Strings, sondern mitten drin. Mit "DELCHR" komme ich logischerweise nicht weiter. Gibt es einen Weg über einen Report (oder ähnliches) alle Leerzeichen die zu viel sind entfernen zu lassen?

Ich habe da keinen Ansatz gefunden.
Vielen Dank an alle ;)

Re: Doppelte Leerzeichen im String entfernen

3. Mai 2017 16:07

Zunächst einmal kannst du mit diesem Filter alle Artikel finden, die mehr als ein Leerzeichen in Folge und irgendwo in der Artikelbeschreibung haben:
Code:
Item.SETFILTER(Description,'*  *');


Für jeden der gefundenen Datensätze sind jetzt überflüssige Leerzeichen zu entfernen. Wenn wir der Einfachheit halber annehmen, dass wir immer - egal wo im Wort - aus 2 oder mehr Leerzeichen nur eines machen, indem wir das erste beibehalten, ergibt sich - pro Artikel - folgender Pseudocode:
Code:
WHILE STRPOS(Item.Description,'  ') > 0 DO
  Auf welcher Position beginnt die Leerzeichenkette?
  Mittels DELSTR(Item.Description,Pos+1,1) das zweite Leerzeichen löschen
END; // bis keine Kette, sondern nur noch einzelne Leerzeichen übrig sind

Und das Ganze natürlich speichern.

Re: Doppelte Leerzeichen im String entfernen

3. Mai 2017 16:14

Hallo galnar,

ich löse solche Probleme eigendlich immer mit regulären Ausdrücken.
Leider habe ich gerade kein NAV 2013 zum testen aber ich denke, dass Regex .NET variabeln schon funktionieren sollten.

Diese Zeile sollte dein Problem lösen:
Code:
NewString := Regex.Replace(String,'\s{2,}',' ',RegexOption.Singleline);


'String' steht in meinem Beispiel für den Text in dem die Leerschritte entfernt werden sollen.
'\s{2,0}' steht für 2 oder mehr Leerschritte. Diese werden dann im nächsten Pararmeter durch ein Leerzeichen ersetzt.
Zurückgegeben wird der Text ohne doppelte Leerzeichen.

Falls die doppelten Leerzeichen restlos gelöscht werden sollen einfach den Leerschritt aus dem 3. Parameter entfernen.
Folgende Variabeln sind dafür notwendig:

Regex DotNet System.Text.RegularExpressions.Regex.'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
RegexOption DotNet System.Text.RegularExpressions.RegexOptions.'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

viele Grüße
Stefan

Re: Doppelte Leerzeichen im String entfernen

3. Mai 2017 16:18

Noch eine Möglichkeit:
Mit STRPOS, COPYSTR und DELCHR kommt man schon weiter :wink: .
Man geht bis zum ersten Leerzeichen. Vorderen Teil inkl. des Leerzeichens mit COPYSTR abschneide, ebenfalls den hinteren Teil ab Position +1 auch mit COPYSTR abschneiden. Auf den hinteren Teil wird dann DELCHR für eventuelle führende Leerzeichen angewendet. Wenn dort im Text nur eins war, passiert nichts, waren es zwei oder mehr, sind die dann weg. Dann alles wieder zusammensetzen. Das muss man für den hinteren Teil ggf. mehrfach wiederholen.

Re: Doppelte Leerzeichen im String entfernen

3. Mai 2017 16:29

Vielen Dank für die Antworten.
Ich werde mich da mal durchwühlen, aber ich denke das hilft mir schon sehr viel weiter..... ;)

Re: Doppelte Leerzeichen im String entfernen

4. Mai 2017 14:17

Hallo,

ich hatte solche Probleme nie mit einem Programm gelöst, sondern einfach die Artikel mit den Beschreibungen exportiert und dann solange:

Ersetze <2 Leerzeichen> mit <1 Leerzeichen>

durchgeführt bis es nichts mehr zu ersetzen gab.
Das macht man ja in der Regel nicht so oft. :wink:

P.S.: Unter der Prämisse ihr habt in den Artikelnummern keine mehrfachen Leerzeichen.

mfg,
winfy

Re: Doppelte Leerzeichen im String entfernen

4. Mai 2017 15:40

Mit einer schönen Funktion geht es auch:

Code:
Item.Description := ReplaceString(Item.Description,'  ',' ');


Code:
ReplaceString(String : Text;FindWhat : Text;ReplaceWith : Text) : Text

WHILE STRPOS(String,FindWhat) > 0 DO
  String := DELSTR(String,STRPOS(String,FindWhat)) + ReplaceWith + COPYSTR(String,STRPOS(String,FindWhat) + STRLEN(FindWhat));
EXIT(String);