Numbering lines
Alex Tweedly
alex at tweedly.net
Sun Oct 28 15:14:18 EDT 2018
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 at 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 at 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 at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
More information about the use-livecode
mailing list