Avatar billede lordnelson Seniormester
10. december 2010 - 09:45 Der er 13 kommentarer og
1 løsning

Split igen igen

Hej
Har en tekst string med en del lighedstegn F.eks.
125=2=1 osv
Vil gerne have værdien inden det først ligheds tegn

Ln
Avatar billede Comasys Praktikant
10. december 2010 - 10:32 #1
str = split(dinstreng,"=")

strOnsket = str(0)
Avatar billede Comasys Praktikant
10. december 2010 - 10:33 #2
Hov.. glemte forklaringen ..

dinstreng = "125=2=1......"
strArr = split(dinstreng,"=")  ' del ved =tegn
strOnsket = strArr(0)  ' tag første del...

Dermed er tallet du søger i strOnsket
Avatar billede at_dk Nybegynder
10. december 2010 - 11:07 #3
Sådan som Comasys skr ville jeg også gøre det, men det er ikke den eneste måde:

str = "125=2=1"        ' strengen du vil "opløse"
pos = inStr(str, "=")  ' positionen på lighedstegnet
res = left(str, pos-1)  ' tæl i str fra venstre indtil positionen - en karakter

Din værdi holdes nu i variablen "res", men som tekst.
Hvis du vil have den som et tal, så tilføj:

res = cInt(res)
Avatar billede softspot Forsker
10. december 2010 - 13:19 #4
I modsætning til at_dk ville jeg vælge instr/left-metoden, da den umiddelbart vil performe ligeså godt eller bedre (ved store strenge - MEGET bedre!).

Husk i øvrigt at udføre grænseværdicheck, da

res = left("streng", -1)

giver en runtime-fejl (hvis strengen ikke indehoder nogen lighedstegn).

Det samme gør sig gældende for split-metoden, hvis strengen er tom

res = split("","=")(0)

da split på en tom streng returnerer et array med nul elementer.
Avatar billede at_dk Nybegynder
10. december 2010 - 16:38 #5
Softspot har nogle gode pointer vedr. værdicheck!
Det KUNNE måske se sådan ud:

str = "" ' en eller anden værdi overført et andet sted fra
If InStr(str, "=") <> 0 Then  ' Se om der er = i strengen
  pos = inStr(str, "=")
  res = left(str, pos-1)
  res = cInt(res)  ' kun hvis du skal regne på tallet senere; vil fejle hvis strengen indeholder andet end heltal, men det kunne til dels klares med et "isNumeric(res)"-check inden denne linje
ELSE  ' Hvis strengen ikke indeholder =
  response.write "Strengen er tom!"
End If

Men nu er problemstillingen jo revet ud af konteksten, så grunden til at jeg selv ville vælge et array til at splitte strengen, var fordi det måske senere kunne blive interessant at se på værdierne før alle lighedstegn...
;-)
/A
Avatar billede softspot Forsker
10. december 2010 - 19:27 #6
Der er ikke nogen grund til at vælge en "dårligere" løsning ud fra en formodning om, at man senere evt. kunne få brug for at gøre noget andet end det man rent faktisk har brug for at gøre lige nu. Så med mindre opgaven indeholder andet end det lordnelson oprindeligt beskrev, ville jeg altså vælge instr/left-metoden... :-)

I øvrigt behøves check ikke involvere to kald til instr, da man blot kan teste på pos efter man har udført instr første gang. Hvis pos er 0, så er der ingen lighedstegn i strengen og left-kaldet er dermed unødvendigt...

Jeg har lavet en funktion som illustrerer hvordan jeg ville implementere det:

function FindFoersteVaerdi(streng, separator)
  dim pos
  pos = instr(streng, separator)
  if pos > 0 then
    FindFoersteVaerdi = left(streng, pos-1)
  else
    FindFoersteVaerdi = streng
  end if
end function

res = FindFoersteVaerdi("", "=")

Så vil jeg lade noget andet kode tage stilling til formatet og typen af returnværdien. Det vil gøre funktionen mere genbrugelig i andre sammenhænge.
Avatar billede softspot Forsker
10. december 2010 - 19:34 #7
Well... faktisk skal grænseværdien for pos skæres lidt anderledes, da left ikke acceptere 0 i anden parameter - og det vil ske, hvis strengen f.eks. ser således ud:

"=nitten!"

Derfor kunne koden i stedet se således ud:

function FindFoersteVaerdi(streng, separator)
  dim pos
  pos = instr(streng, separator)
  if pos > 1 then
    FindFoersteVaerdi = left(streng, pos-1)
  elseif pos = 1 then
    FindFoersteVaerdi = ""
  else
    FindFoersteVaerdi = streng
  end if
end function

res = FindFoersteVaerdi("", "=")
Avatar billede ksoren Nybegynder
10. december 2010 - 20:17 #8
Man kunne klistre noget på for at undgå fejl ved Split og en tom streng

result = Split(str & "=", "=")(0)
Avatar billede softspot Forsker
10. december 2010 - 20:40 #9
Tjooh, men det ville jo give et element som ellers ikke ville være der i det oprindelige resultat, hvilket så kunne give anledning til andre (nye) krumspring for at omgå dette nye element...
Avatar billede ksoren Nybegynder
10. december 2010 - 20:52 #10
Men hvis man i dette tilfælde aldrig ønsker mere end første element, så er det en lille nem kode.
Avatar billede at_dk Nybegynder
10. december 2010 - 21:33 #11
Meget elegant løsning, synes jeg!
/A
Avatar billede softspot Forsker
10. december 2010 - 21:44 #12
Man skal blot overveje de omkostninger der følger med en løsning når man vælger den. At benytte split til denne opgave er voldsomt, da det involverer en del arbejde for serveren at skulle allokere arrays, indeksering og streng-konkatenering (med deraf følgende reallokering af streng), bare for at hente en delstreng... :-)
Avatar billede lordnelson Seniormester
19. marts 2012 - 10:35 #13
lukker
Avatar billede softspot Forsker
19. marts 2012 - 12:31 #14
Lidt dårlig stil bare at lukke uden at takke for hjælpen eller deltage i tråden på nogen måde overhovedet... :/
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester