Kirjoittaja: sooda
Kirjoitettu: 07.05.2004 – 07.05.2004
Tagit: teksti, koodi näytille, vinkki
Splitti qb:lle. Eli explode. Eli pilkkoo stringin osiin. Perskuta kun qb:ssä funkkarit ei voi palauttaa taulukkoa, sille pitää antaa taulukko johon ne tungetaan. Mutta ihan toimiva :P
Ite funkkari
'split%: splittaa stringin ja palauttaa montako osaa l?ytyi yht.
'parametrit:
' stringi$: merkkijono joka splitataan
' erotin$: erotin joka on splitattavien tekstien v?liss?
' taulu$(): taulukko johon tekstit menee
' max%: jos t?m? m??r? ylittyy, ei splittailla en??. < 1 niin haetaan kaikki
FUNCTION split% (stringi$, erotin$, taulu$(), max%)
se$ = stringi$ 'ei rikota alkuper?ist? teksti?...
kohta% = INSTR(se$, erotin$) 'miss? kohdassa on eka erotin$
IF kohta% = 0 THEN EXIT FUNCTION'jos ei ole yht??n niin ei anneta yht??n
WHILE kohta% 'etsit??n lis?? kunnes ei erotinta l?ydy en??
taulu$(ne%) = LEFT$(se$, kohta% - 1) 'lis?t??n l?ydetty taulukkoon
se$ = MID$(se$, kohta% + LEN(erotin$)) 'irrotetaan jo l?ydetty
ne% = ne% + 1 'lis?t??n laskuria
kohta% = INSTR(se$, erotin$) 'miss? kohdassa seuraava erotin$
IF ne% = max% THEN 'jos ei haluta en?? niin ei anneta en??
split% = ne%
EXIT FUNCTION
END IF
WEND
taulu$(ne%) = se$ 'viimeinen osa
split% = ne% + 1 'kerrotaan montako l?ytyi
END FUNCTIONtestiohjelma
'esimerkkiohjelma joka n?ytt?? kuinka tota k?ytet??n
DIM m$(3) 'taulukko johon ne tulee
PRINT split("no;hei;erkki", ";", m$(), 0)'kerrotaan montako l?ytyi
PRINT m$(0) 'ja kerrotaan ne jotka l?ytyi.
PRINT m$(1)
PRINT m$(2)Kätevää. Käytin samantyylisiä keinoja kerran, kun tein funktion, joka palauttaa osan, joka sijaitsee merkkijonossa kahden merkin välissä. Sillä sai etsiä esim. sulkujen, tai lainausmerkkien väliin pistettyjä huomautuksia. En muuten tiennyt, että INSTR toimii QB:ssäkin. No nytpähän tiedän. :)
Heippa!
'QBasic SPLIT
DECLARE SUB SPLIT (mjono$, erotin$)
REDIM SHARED SplitStr(0) AS STRING
'Testi
SPLIT "12345|23456|34567|45678|56789", "|"
IF SplitStr(0) <> "" Then
FOR i = 0 TO UBOUND(SplitStr)
PRINT SplitStr(i)
NEXT i
END IF
SPLIT "ABCDE,FGHIJ,KLMNO,PQRST,UVWXY", ","
IF SplitStr(0) <> "" THEN
FOR i = 0 TO UBOUND(SplitStr)
PRINT SplitStr(i)
NEXT i
END IF
SYSTEM
SUB SPLIT (mjono$, erotin$)
REDIM SplitStr(0)
IF INSTR(mjono$, erotin$) = 0 THEN
EXIT SUB
END IF
DIM i AS LONG, j AS LONG
FOR i = 1 TO LEN(mjono$)
IF MID$(mjono$, i, 1) <> erotin$ THEN
SplitStr(UBOUND(SplitStr)) = SplitStr(UBOUND(SplitStr)) + MID$(mjono$, i, 1)
REDIM temp(UBOUND(SplitStr) + 1) AS STRING
ELSEIF MID$(mjono$, i, 1) = erotin$ THEN
FOR j = 0 TO UBOUND(SplitStr)
temp(j) = SplitStr(j)
NEXT j
REDIM SplitStr(UBOUND(temp)) AS STRING
FOR j = 0 TO UBOUND(temp)
SplitStr(j) = temp(j)
NEXT j
ERASE temp
END IF
NEXT i
END SUB