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 FUNCTION
testiohjelma
'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