Leerzeichen löschen aus String

Begonnen von m-obi, 24. Januar 2011, 11:52:32

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

m-obi

Hallo,

ich bekomme von SMS_RECEIVE eine SMS als String. In der stehen eigentlich 5 Zeichen, aber LEN zeigt mir 80 an. Also so viel wie maximal der String haben kann. Wie bekomme ich jetzt die restlichen 75 Stellen weg? Mit LEFT hab ichs schon probiert, ich könnte einfach 5 hinschreiben, aber die Anzahl schwankt immer.

peewit

#1
1. viel spass mit der ILC 150 GSM/GPRS

2. das mit den vielen leerzeichen hört sich merkwürdig an
  hast du aufgepasst das der baustein eigentlich ein array of string benötigt ?
  also 2 x 80 zeichen
  hast du hier evntuell etwas falsch gemacht

3. ich nehme an du willst nur die leerzeichen ganz links bzw. alle leerzeichen am ende entfernen
und zwischen dem ersten und letzten buchstaben sollen alle leerzeichen drinnen bleiben

4. dann nimmst du einfach den baustein "TRIME" der oscat-bibliothek

m-obi

1. Danke, den hab ich. Ist echt nen super Teil.

2. Hab ich alles richtig gemacht.

3. + 4. Hab mir jetzt nen Baustein gebastelt, klappt super.


Danke nochmal!

m-obi

Hmm, klappt doch nicht, hatte es an einem Teststring getestet, da hat es auch geklappt. Nur es geht nicht mit dem String den ich bekomme von SMS_RECEIVE. Kann es sein das er die fehlenden Stellen mit anderen Steuerzeichen auffüllt?

peewit

das ganze hört sich nicht logisch an !

leider beschreibst du nicht wie sieht dein string aus, und was bekommst du als ergebnis nach der TRIME function


stelle mal dein programm online, und mache eine bildschirmhardcopy von deinen online-werten

das du vom sms_receive einen mit leerzeichen gefüllten string bekommst, ist auf jeden fall nicht normal, und fraglich ob das wirklich so ist. !
da müsste schon der absender das so bescheuert versenden, was ich aber nicht glaube

m-obi

#5
So hab das Problem mit einem Kollegen aus dem Servie-Center von Phoenix lösen können. Aus welchen Grund auch immer wird irgendwo soweit der String mit Zeichen gefüllt bis er eine Länge von 80 Stellen hat. Aber diese Zeichen sind keine Leerzeichen, wir wissen noch nicht um welche Zeichen es sich handelt. Ich habs so gelöst. Zuerst wandel ich den String mit STRING_TO_BUF in einem Buffer um, so das ich jedes Zeichen als Byte habe, also als ASCII-Code in Hex. Dann stelle ich fest wo der String eigentlich aufhört, nämlich wenn er mir 16#00 anzeigt, das ist nämlich das Zeichen, und von dem folgen noch ganz viele bis zu 80. Stelle. Den Zählwert z.B. 5 gebe ich an BUF_TO_STRING als BUF_CNT und den erstellten Buffer an BUFFER weiter und bekomme dann einen String mit 5 Zeichen. Tada!

Und hier die Verwendung des 16#00 (Null-Zeichen) laut Wikipedia:
"Das Nullzeichen kann auf Speichermedien als Füllzeichen verwendet werden, beispielsweise um unbelegten Speicherplatz zu füllen. In einigen Übertragungsprotokollen wird es als zeitliches Füllsignal verwendet, das nach Belieben in eine Nachricht eingefügt werden kann und vom Empfänger verworfen wird. Damit werden bei synchroner Datenübertragung Verzögerungen auf der Senderseite überbrückt, ohne die eigentlichen Nutzdaten zu beeinflussen.

In einigen Programmiersprachen, beispielsweise C, wird das Nullzeichen als Markierung für das Ende einer Zeichenkette verwendet. Da es in normalen Texteditoren nicht direkt eingebbar ist, wird es im Quelltext durch die Escape-Sequenz „\0“ (umgekehrter Schrägstrich gefolgt von Ziffer 0) oder hexadezimal als 0x00 dargestellt."

Jetzt klingts logisch und leuchtet ein.

peewit

gut, wenn der sms-sender den string so anfüllt, dann erklärt sich dein problem

habe noch eine andere lösung

x := BYTE_TO_STRING(BYTE#00,'%c'); (* erzeugt einen string mit einen /0 im string*)
SMS_TEXT_NEU := DEL_CHARS(SMS_TEXT, x); löscht alle /0 aus dem string


oder wenn du alle zeichen kennst du kommen werden, dann kannst du genau umgekehrt arbeiten
dann werden alle zeichen die nicht aufgelistet sind automatisch entfernt
Baustein "CLEAN"

SMS_TEXT_NEU := CLEAN(SMS_TEXT, '0123456789')  (* hier werden alle zeichen gefiltert die keine ziffern sind *)

letztere variante ist die beste, da sie sehr einfach ist !!

gruss peewit

m-obi

Ich weiß ja auch das das Nullzeichen kommt, und sonst kommen alle Buchstaben, Zahlen und Sonderzeichen. Also achte ich aufs Nullzeichen. Das ist noch einfacher.

Übrigens Nullzeichen ist \0 nicht /0. ;)

peewit

hallo

eine lösung mit standard-functionen !!!

x := BYTE_TO_STRING(BYTE#00,'%c');          (* erzeugt einen string mit einen \0                     *)
pos := FIND(sms_text,x);                            (* bestimmt die position des ersten \0 in sms_text *)
sms_text_neu := LEFT(sms_text,pos);           (* übernimmt alle zeichen links vom ersten \0        *)


fertig !!!

m-obi

Hab ich auch grade vor ca. 5 Minuten herausgefunden  ;D.
Aber trotzdem Danke.

Aber bei LEFT pos - 1, da ich ja nur die 5 Zeichen haben möchte.

m-obi

OT: Kann es sein das die Forumsuhr 7 Minuten vorgeht? Bei mir ist es 11.09 Uhr

peewit

Zitat von: m-obi in 27. Januar 2011, 11:09:14
Hab ich auch grade vor ca. 5 Minuten herausgefunden  ;D.
Aber trotzdem Danke.

Aber bei LEFT pos - 1, da ich ja nur die 5 Zeichen haben möchte.


gut das du mitdenkst !