How do you delete characters in a string?
10-31-2017, 03:13 AM
Post: #1
 webmasterpdx Senior Member Posts: 495 Joined: Sep 2015
How do you delete characters in a string?
I need to remove a few characters in a string. I've tried to do it one by one using S(3):=""; but it doesn't work. S(3):="g" does replace a character but not with the null string "". I've tried S(3,1):= but you can't assign a value to this. REPLACE will work but you need to know the string beforehand and it'll replace other occurances of this string.

The only way I can see is to take the string before and after the point I want to remove the chars, and create a new string by appending them. This seems like a lot of work for such a simple task. Anyone know how to just remove a few characters at a known point in a string?
10-31-2017, 03:22 AM (This post was last modified: 10-31-2017 03:23 AM by Tim Wessman.)
Post: #2
 Tim Wessman Senior Member Posts: 1,694 Joined: Dec 2013
RE: How do you delete characters in a string?
Do it the longer way or else wait a bit.

TW

Although I work for the HP calculator group, the views and opinions I post here are my own.
10-31-2017, 03:29 AM
Post: #3
 webmasterpdx Senior Member Posts: 495 Joined: Sep 2015
RE: How do you delete characters in a string?
What do you mean wait a bit?
10-31-2017, 03:56 AM
Post: #4
 Tim Wessman Senior Member Posts: 1,694 Joined: Dec 2013
RE: How do you delete characters in a string?
"suppress" will remove an item (cas command) but the quickest way is still going to be make your own delete command if you are trying to remove N objects starting at position M. Takes 1 line...

TW

Although I work for the HP calculator group, the views and opinions I post here are my own.
10-31-2017, 05:07 AM
Post: #5
 webmasterpdx Senior Member Posts: 495 Joined: Sep 2015
RE: How do you delete characters in a string?
Ah, suppress works! ....as in S:=suppress(S,3);
10-31-2017, 11:59 AM (This post was last modified: 10-31-2017 12:05 PM by webmasterpdx.)
Post: #6
 webmasterpdx Senior Member Posts: 495 Joined: Sep 2015
RE: How do you delete characters in a string?
suppress() works but it's much faster to use RIGHT() and LEFT() functions. Be careful as there are CAS functions right() and left() that are related to equations.

So, the optimal way to drop characters in a string is as follows.

Code:
 // Drops characters from string // S   string // L   Position before first character to drop // R   Position after last character to drop // e.g. S:=STRDEL(S,3,7); drops S(4), S(5) and S(6) from S. EXPORT STRDEL(S,L,R) BEGIN RETURN LEFT(S,L)+RIGHT(S,DIM(S)-R+1); END; // BEGIN...

I tested this a couple of different ways using TEVAL. I ran code using a string with suppress, scanning the string using FOR loops and finally using RIGHT and LEFT. I just ran the same code 10000 times to get the timing. Note that suppress was as faster than the FOR loops for dropping a single character since it's doing much the same thing except the FOR loop in suppress is in machine code. However, when you drop multiple characters calling suppress multiple times, you are effectively scanning the string over and over again, so the FOR loop catches up when you get to 5 or so characters to drop. The RIGHT and LEFT versions was always faster for everything. Dropping 5 characters using suppress was around 70 seconds while RIGHT and LEFT was only 5 seconds....considerably faster. Dropping one character, suppress was around 15 seconds while RIGHT and LEFT was around 5 seconds still.
Enjoy.
10-31-2017, 12:26 PM (This post was last modified: 10-31-2017 12:26 PM by Arno K.)
Post: #7
 Arno K Senior Member Posts: 302 Joined: Mar 2015
RE: How do you delete characters in a string?
Did you try something like "SUPPRESS(s,"2357")" which deletes all occurences at once?
Arno
10-31-2017, 01:46 PM
Post: #8
 webmasterpdx Senior Member Posts: 495 Joined: Sep 2015
RE: How do you delete characters in a string?
I don't understand your second argument to suppress there. The second argument is supposed to be an integer. I tried it verbatim and it didn't seem to change the string at all.

This brings up some issues regarding XCAS vs PRIMECAS. I notice that XCAS allows ranges like 1..3, but PRIME CAS doesn't. I'm presuming you are somehow telling CAS to use a range of string postions, but I can't tell it's format....can you explain what you are trying to do? Thanks
10-31-2017, 01:52 PM
Post: #9
 cyrille de brébisson Senior Member Posts: 622 Joined: Dec 2013
RE: How do you delete characters in a string?
hello

st:=st(1,4)+st(7,100);
will remove elements 5 to 6 of the string.
100 can be changed into a 1e9 if/as needed

Cyrille

Although I work for the HP calculator group, the views and opinions I post here are my own. I do not speak for HP.
10-31-2017, 11:05 PM
Post: #10
 Didier Lachieze Senior Member Posts: 814 Joined: Dec 2013
RE: How do you delete characters in a string?
(10-31-2017 11:59 AM)webmasterpdx Wrote:  So, the optimal way to drop characters in a string is as follows.

Code:
 // Drops characters from string // S   string // L   Position before first character to drop // R   Position after last character to drop // e.g. S:=STRDEL(S,3,7); drops S(4), S(5) and S(6) from S. EXPORT STRDEL(S,L,R) BEGIN RETURN LEFT(S,L)+RIGHT(S,DIM(S)-R+1); END; // BEGIN...

This doesn't work if you want to drop the first or the last character of the string.
STRDEL("ABCDEFGHIJK",0,7) returns "ABCDEFGHIJKGHIJK"

Here is a working version using Cyrille substrings notation:

Code:
EXPORT STRDEL(S,L,R) BEGIN  LOCAL d:=DIM(S);  IFTE(L<1,"",S(1,L))+IFTE(R>d,"",S(R,d)); END; // BEGIN...

STRDEL("ABCDEFGHIJK",0,7) returns "GHIJK"
10-31-2017, 11:46 PM
Post: #11
 StephenG1CMZ Senior Member Posts: 486 Joined: May 2015
RE: How do you delete characters in a string?
(10-31-2017 03:22 AM)Tim Wessman Wrote:  Do it the longer way or else wait a bit.

Tim, I thought you were hinting at a little gem to look forward to in the next release...
I discovered "suppress" already exists just in time to include a reference to it in my new list processing API.

Stephen Lewkowicz (G1CMZ)
11-01-2017, 03:07 AM
Post: #12
 webmasterpdx Senior Member Posts: 495 Joined: Sep 2015
RE: How do you delete characters in a string?
if you have a string, s, in CAS mode, type s(1,1e9)

It reboots the Prime!!!!!
11-01-2017, 03:23 AM
Post: #13
 webmasterpdx Senior Member Posts: 495 Joined: Sep 2015
RE: How do you delete characters in a string?
The substring notation method is actually a little faster than the RIGHT/LEFT method. With a 20000 loop, it's about 0.1 times faster...i.e. RIGHT/LEFT takes about 10 seconds and S(I,N) method takes about 9 seconds.
11-01-2017, 04:11 AM (This post was last modified: 11-01-2017 04:11 AM by webmasterpdx.)
Post: #14
 webmasterpdx Senior Member Posts: 495 Joined: Sep 2015
RE: How do you delete characters in a string?
So, this is seems to be the most optimized version for now.

Code:
 // Drop chars from string. // S   String. // L   Pos of leftmost char before deletion. // R   Pos of first char on right after deletion. EXPORT STRDEL(S,L,R) BEGIN LOCAL N:=DIM(S); RETURN IFTE(L<1,"",S(1,L))+IFTE(R>N,"",S(R,N)); // N just has to go past end of string END; // BEGIN...
 « Next Oldest | Next Newest »

User(s) browsing this thread: 1 Guest(s)