Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Sort numbers in strings
#1
How can I sort this:

ab1234/3:10
ab1234/3:9
bc3234/2:3
ch8218/5:2
ab1234/3:1
bc3234/2:2

---->

ab1234/3:1
ab1234/3:9
ab1234/3:10
bc3234/2:2
bc3234/2:3
ch8218/5:2

?
#2
Macro
Code:
Copy      Help
out
str s=
;ab1234/3:10
;ab1234/3:9
;bc3234/2:3
;ch8218/5:2
;ab1234/3:1
;bc3234/2:2
ARRAY(str) a=s
a.sort(0 sort_proc_str_logical 0)
s=a
out s

Function sort_proc_str_logical
Code:
Copy      Help
function# param str&a str&b

dll- shlwapi #StrCmpLogicalW @*psz1 @*psz2

if(_winver>=0x501) ;;XP
,BSTR w1(a) w2(b)
,ret StrCmpLogicalW(w1 w2)
else
,ret StrCompare(a b 1)

On Windows 2000 will sort differently, because StrCmpLogicalW is not available.
#3
Thanks, but the result is:

ab1234/3:1
ab1234/3:10
ab1234/3:9
bc3234/2:2
bc3234/2:3
ch8218/5:2

and it should be:

ab1234/3:1
ab1234/3:9
ab1234/3:10
bc3234/2:2
bc3234/2:3
ch8218/5:2

note 1: 9 before 10
note 2: This computer (W2000).
#4
StrCmpLogicalW - XP and later.
#5
Is possible to implement StrCmpLogicalW in QM?
#6
Maybe you can find source code on the internet.
#7
http://madebits.com/articles/numsort/index.php

Can you convert to QM?
#8
cannot convert this. Look for C++ code.
#9
Does this help?


Attached Files
.zip   StrCmpLogicalW.zip (Size: 10.09 KB / Downloads: 296)
#10
you better look at the code. It uses StrCmpLogicalW and therefore will not work on w2000.
#11
This is not perfect and little tested.

Macro
Code:
Copy      Help
out
str s=
;ab1234/3:10
;ab1234/3:9
;bc3234/2:3
;ch8218/5:2
;ab1234/3:1
;bc3234/2:2
ARRAY(str) a=s
;a.shuffle

a.sort(0 sort_proc_str_logical 0)
out a

Function sort_proc_str_logical
Code:
Copy      Help
function# param str&a str&b

ret StrCompareLogical(a b)


;dll- shlwapi #StrCmpLogicalW @*psz1 @*psz2
;
;if(_winver>=0x501) ;;XP
,;BSTR w1(a) w2(b)
,;ret StrCmpLogicalW(w1 w2)
;else
,;;ret StrCompare(a b 1)
,;ret StrCompareLogical(a b)

Function StrCompareLogical
Code:
Copy      Help
;/
function# $s1 $s2

lpstr sn="0123456789"
if(findcs(s1 sn)<0 or findcs(s2 sn)<0) ret StrCompare(s1 s2 1)

str ss1(s1) ss2(s2)
REPLACERX r.frepl=&SCL_RxProc
ss1.replacerx("\d+" r)
ss2.replacerx("\d+" r)
;out ss1
ret StrCompare(ss1 ss2 1)

Function SCL_RxProc
Code:
Copy      Help
;/
function# REPLACERXCB&c

if(c.match.len<9) c.match.from("000000000"+c.match.len c.match)
#12
Thanks.
What about this?

http://209.85.129.132/search?q=cache:3c ... =clnk&cd=2
#13
Also not perfect. And difficult to convert. Try my code, if something will not work as expected, I'll try to fix it.
#14
Thanks for all.

Otherwise.

Is there any easy way to extract the strings missing from the series?

In the example:

ab1234/3:2
ab1234/3:3
ab1234/3:4
ab1234/3:5
ab1234/3:6
ab1234/3:7
ab1234/3:8
bc3234/2:1
ch8218/5:1
#15
no
#16
Thanks again.

Macro
Code:
Copy      Help
str a.getfile("$desktop$\PRUEBA.TXT")
str linea t1 t2 final
a.eliminar_lineas_vacias
foreach linea a
,if(!linea.end("1"))
,,int temp i numero
,,_s.get(linea find(linea ":")+1)
,,;out linea
,,;out _s
,,numero=val(_s)
,,for i numero 0 -1
,,,t1.left(linea find(linea ":"))
,,,;out t1
,,,t2.format("%s:%i" t1 i)
,,,;out t2
,,,if(find(a t2)<0)
,,,,final.formata("%s[]" t2)
;out final
eliminar_lineas(final "" "" 1)
ARRAY(str) lii=final
lii.sort(0 sort_proc_str_logical 0)
final=lii

final.insertmultiline(" <---" -1)
str total.from(a final)
lii=total
lii.sort(0 sort_proc_str_logical 0)
total=lii
out total
total.setclip


Forum Jump:


Users browsing this thread: 1 Guest(s)