David,

I think you are correct - there is no magic version of split or array that will do what you want.

You require to keep the line ordering completely unchanged - and Hermann's superfast method can't meet that need.

The best solution (AFAIK) will be the one Mark Hsu and/or Jacqueline already gave, and indeed you already tried. However, your test was unsuccessful, because the time spent updating the progress bar swamped the (relatively small) amount of actual work to be done. Without any progress bar updates, my aging MacBookPro does 3000 lines in 14 ms (lines of 50 chars each).

If you may encounter much larger data sets, then you should have a progress indicator of some kind.

I would say you should NEVER update a progress bar every time round a loop without a check against doing it too frequently.


The simple way is something like

put the millisecs into timeLastUpdated
put 50 into  kMinUpdateTime
repeat ....
    .... do something ...
    if the millisecs - timeLastUpdated < kMinUpdateTime then
        ... update the scrollbar
        put the millisecs into timeLastUpdated
    end if
where end repeat

NB kMinUpdateTime should be adjusted depending on how important the updates are, and how frequently you want them I'd say rarely below 50ms - I'd usually use 200ms or longer.

-- Alex.

On 28/10/2018 18:14, David V Glasgow via use-livecode wrote:
Thanks for this, although I’m not sure I understand.  In fact I am sure I 
don’t.    I know how amazingly fast the array method is, I use it elsewhere in 
the same stack, and it is great.

I also don’t understand the distinction between line numbering and indexing.  
If I was guessing, I would go for line numbering prepends to each line in a 
text field a number, and indexing is adding a numerical key to a database or 
array.  The former is what I described in my original post.

The reason the issue arrises is because some of the text/chat message records I 
referred to have the date and time stamps stripped out.  So in the following 
exchange…

1757    Shadowknave: U gotta b there
1758    What_goes_Moo: kk
1759    Shadowknave: no let down?
1760    What_goes_Moo: kk
1761 Shadowknave: U b there 8?
1762 What_goes_Moo: I wil

… lines 2 and 4 would be identical but for the line number I added via the 
script. And of course, the integrity of the dialogue must be maintained.

  I had believed that collapsing duplicates and alphabetising are unavoidable 
with split.  If there is an array method which doesn’t mess with the text 
message order or content, then I would be delighted.  Is that what this is 
below, but I haven’t appreciated it?

Cheers,

David G


On 28 Oct 2018, at 1:47 pm, hh via use-livecode <use-livecode@lists.runrev.com> 
wrote:

David G. wrote:
Thanks Geoff, I did play with Split, but one of the reasons for numbering
is to make any identical lines unique.  With split, for any that are not,
all but one is deleted.  So definitely not the result I wanted.
I am not Geoff (who played with the simple array methods I suggested).
But your post attacks indirectly my suggested handlers below as wrong, as if
they would not hit your question.

My handlers (which are at least 600 times faster than your first script)
output exactly the same what your first script outputs, seen apart from the
optional delimiter.

So definitely not the result I wanted.
LOL: You mention above the "unique"-side-condition the first time...

With your new side condition from above several others (and I) know also
how this is doable very fast, once again using arrays. And it is an
invertible method, that is, the original text is exactly restorable.

But first post YOU your new handler, to see *all* your new side conditions,
that is, or to see what you really want:
Certainly not a line numbering, rather indexing a text file.

David G. wrote: [This is the first script]
However….
Sometimes I want to prefix each line with the line number, and do this:

put 1 into tcount
repeat for each line j in it
put tcount & j into line tcount of it
put tcount + 1 into tcount
set the thumbpos of scrollbar "filterprog" to tcount
end repeat
put it into field “numberedtext”

I use ‘it’ because of a dim memory (superstition? Myth?) from long ago that
it is faster than an arbitrarily named variable. Still, the whole process
is pretty darned slow. Any brilliant suggestions?
Geoff C. wrote:
And of course if retaining the order isn't critical you could just go with:

function numberText T,D
   split T by cr
   combine T by cr and D
   return T
end numberText

function unNumberText T,D
   split T by cr and D
   combine T by cr
   return T
end unNumberText
Hermann H. wrote:
1. Besides removing scroll-update, which takes most of the time, you could
try the following array-methods (which are essentially from my stack

http://forums.livecode.com/viewtopic.php?p=101301#p101301
, see there
card "LineNums, tab "Nb2").

This needs here on a medium fast machine (Mac mini, 2.5GHz) in average
with LC 9.0.1 (which is at about 30% faster than LC 8.1.10 with that):

680 ms for 10000 lines to add the line numbers,
650 ms for 10000 lines to remove the line numbers,
both incl. the field update (a lot of long lines are to break).

-- Add "inline line numbers" [-hh fecit, 2014]
-- Uses separator ": " (In LC 6 use one single char, remove below needs that)
on mouseUp
  lock screen; lock messages
  put the millisecs into m1
  set cursor to watch
  put fld "IN" into T
  split T by return
  put the keys of T into K
  sort K numeric
  repeat for each line L in K
    put cr & L & ": " & T[L] after S --> change separator here
  end repeat
  set text of fld "OUT" to char 2 to -1 of S
  put -1+the num of lines of S & " lines: " & \
        the millisecs -m1 & " ms" into fld "timing"
end mouseUp

-- Remove "inline line numbers" [-hh fecit, 2014]
-- Uses separator ": " (the above, in LC 6 you have to use one single char)
on mouseUp
  lock screen; lock messages
  put the millisecs into m1
  set cursor to watch
  put the text of fld "OUT" into S
  split S by return and ": " --> change separator here
  put the keys of S into K
  sort K numeric
  repeat for each line L in K
    put cr & S[L] after T
  end repeat
  put char 2 to -1 of T into fld "IN2"
  put -1+the num of lines of T & " lines: " & \
        the millisecs -m1 & " ms : " & (fld "IN2" is fld "IN") into fld "timing"
end mouseUp
_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode


_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to