webForumDet fria alternativet

Hantera tomma 'strängar'

ASPur ASP

17 svar · 836 visningar · startad av devotion

Medlem sedan jan. 20013 582 inlägg
Frågan#1

Har två funktioner enligt:

function GetPostalAddress(s)
	dim a
	
	a = split(s, ";")

	GetPostalAddress = a(4)
end function

function GetPostalCodeAndCity(s)
	dim a
	
	 a = split(s, "  ")

	GetPostalCodeAndCity = a(0) & """" & ";" & """" & a(1)
end function

Som skall dela upp en sammansatt postnummer/ort i en semikolonseparerad lista enligt:

"kundnummer";"kundnamn";"adress1";"Adress2";"PostnummerOrt";

PostnummerOrt har formatet; '370 42 Torhamn' dvs 2 mellansteg mellan postnummer och ort.

Först körs funktion 1 på strängen, sen funktion 2

enligt:

foo = GetPostalCodeAndCity(GetPostalAddress(s))

Problemet är när PostnummerOrt är tom, då funktionen ballar ur...

Hur hanterar man det?

Mvh
Henrik

Medlem sedan juni 20019 519 inlägg
#2

Kör som du kör, split men populera en array med x poster, erstätt om det finns något i spliten: str(x) = splitStr(x)...

Medlem sedan jan. 20013 582 inlägg
#3

fötydligande:
felaktigt matrisindex: '[number: 1]' --> "ballar ur"

;)

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#4

voigtann1 skrev:

Kör som du kör, split men populera en array med x poster, erstätt om det finns något i spliten: str(x) = splitStr(x)...

Provade en annan väg:

function GetPostalCodeAndCity(s)
	dim a, b
	
	a = split(s, ";")
	
	if instr(a(4), " ") > 0 then
		b = split(a(4), "  ")
		GetPostalCodeAndCity = ";" & b(0) & """" & ";" & """" & b(1)
	else
		GetPostalCodeAndCity = ";"""";"""""
	end if
end function

s="""kundnummer"";""kundnamn"";""adress1"";""Adress2"";""370 42  TORHAMN"";"

response.write GetPostalCodeAndCity(s)

Funkar bra på:

s="""kundnummer"";""kundnamn"";""adress1"";""Adress2"";""370 42  TORHAMN"";"

och:

s="""kundnummer"";""kundnamn"";""adress1"";""Adress2"";"""";"

Men smäller på:

s="""kundnummer"";""kundnamn"";""adress1"";""Adress2"";""370 42 TORHAMN"";"

Dvs om det bara är ett mellanslag mellan postnummer och ort...

Hur kan man fixa det?

Mvh
henrik

Medlem sedan juni 200032 969 inlägg
#5

Du kan göra oändliga kontroller av datat (exempelvis kan du ju med instr kontrollera om det finns två mellanslag i följd i posten som ska innehålla postnummer och ort), men du kan aldrig gardera dig mot allt om indatan håller så dålig kvalité.

Varifrån kommer datat?

Medlem sedan jan. 20013 582 inlägg
#6

Hej,

Data kommer från ett affärssystem, där de har ovanan att skriva postnummer/ort i samma fält. Det är då upp till användaren att skriva rätt.

Har datat rätt format, så är det ju lätt att dela upp strängen. Är det fel format vill jag ju dock inte att funktionen smäller utan att tex både postnummer och ort läggs på ort. Då syns det ju om det är fel, och man kan gå in och korrigera...

Mvh
Henrik

Medlem sedan juni 200032 969 inlägg
#7

Ok, ett alternativ då:

Kontrollera att det finns två mellanslag mellan postnummer och ort - annars, returnera ett felmeddelande som du tar om hand och visar användaren.

Medlem sedan jan. 20013 582 inlägg
#8

@nders skrev:

Ok, ett alternativ då:

Kontrollera att det finns två mellanslag mellan postnummer och ort - annars, returnera ett felmeddelande som du tar om hand och visar användaren.

Jag vill att detta skall kunna köras med automatik, så helst inga felmeddelanden... :)

Däremot, att allt läggs i samma fält (ort) om det inte finns två mellansteg...

:)

Mvh
Henrik

Medlem sedan juni 20019 519 inlägg
#9

Om det är samma struktur hela tiden så kan du köra RegExp:

<%
Function GetMatch(s)
	Dim objRegExp, myMatches
	Set objRegExp = New RegExp
	objRegExp.IgnoreCase = True
	objRegExp.Pattern = """([^""]*)"";""([^""]*)"";""([^""]*)"";""([^""]*)"";""([^""]*)"";"
	Set myMatches = objRegExp.Execute(s)
	If myMatches.Count >= 1 Then
		Set GetMatch = myMatches(0).SubMatches
	End If
	Set objRegExp = Nothing
End Function

s="""kundnummer"";""kundnamn"";""adress1"";""Adress2"";""370 42  TORHAMN"";"
Response.Write(GetMatch(s)(4)) '370 42  TORHAMN
Response.Write("<br />")
s="""kundnummer"";""kundnamn"";""adress1"";""Adress2"";""370 42 TORHAMN"";"
Response.Write(GetMatch(s)(4)) '370 42 TORHAMN
%>

redigerad, ändra + till * om det är så att vissa av fälten kan vara tomma.

Medlem sedan dec. 20025 483 inlägg
#10
function GetPostalCodeAndCity(s)
  Dim a
  a = split(s, "  ")
  if ubound(a) = 1 then
    GetPostalCodeAndCity = a
  else
    GetPostalCodeAndCity = Array("", a(0))
  end if
end function

...

foo = GetPostalCodeAndCity(MyText)
' foo(0) = postnr
' foo(1) = ort (eller allt, beroende på)
Medlem sedan jan. 20013 582 inlägg
#11

Hepp!

Får

Körningsfel i Microsoft VBScript

Ogiltig användning av Null: 'split'

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#12

Hur får jag följande att fungera:

<%

function GetPostalCodeAndCity(s)
	Dim a
	if instr(s, " ") > 0 then
		a = split(s, "  ")
		if ubound(a) = 1 then
			GetPostalCodeAndCity = a
		else
			GetPostalCodeAndCity = Array("", a(0))
		end if
	end if
end function

dim s

s=""

foo =GetPostalCodeAndCity(s)
response.write  foo(0) & " " & foo(1)

%>

Dvs om det är en tom sträng?

Övriga fall funkar finfint..

PLEASE!!

Mvh
henrik

Medlem sedan juni 20019 519 inlägg
#13

Kolla om den har värdet InStr, du vill ju inte splitar om det inte finns.

Medlem sedan jan. 20013 582 inlägg
#14

Men, hur ser det ut i koden?

jag tycker jag testat allt...

s = " " funkar ju med men inte ""

:(

Mvh
henrik

Medlem sedan juni 20019 519 inlägg
#15

Du få kolla att du inte försöker splitar en NULL objeket, men det känns extremt osäkert när det variera så extremt mycket i dina data.

s = " " funkar ju med men inte ""

matchar ju inget som du har gett oss tidigare. Är omöjligt att ge en korrekt kod som automatiskt löser alla problem om man inte vet vilka typer av data som den kan uppkomma i dina koder.

Medlem sedan jan. 20013 582 inlägg
#16

Nä, jag förstår det... Har varit lite splittrat idag....

Men iaf, Nu kan det inte bli NULL iaf eftersom jag la till en tom sträng på Recordsetet... Rs("foo") & ""

Dock kan det ju bli tomt.

Det kanske inte är svårare än att kontrollera att s inte är tom?

Typ:

<%

function GetPostalCodeAndCity(s)
	Dim a
	if s <> "" then
		a = split(s, "  ")
		if ubound(a) = 1 then
			GetPostalCodeAndCity = a
		else
			GetPostalCodeAndCity = Array("", a(0))
		end if
	else
		'göra något fint
	end if 
end function

dim s

s=""

foo =GetPostalCodeAndCity(s)
response.write  "foo " & foo(0) & " " & "foo " & foo(1)

%>

Mvh
Henrik

Medlem sedan juni 20019 519 inlägg
#17
function GetPostalCodeAndCity(s)
	Dim a
	if s <> "" then
		a = split(s, "  ")
		if ubound(a) = 1 then
			GetPostalCodeAndCity = a
		else
			GetPostalCodeAndCity = Array("", a(0))
		end if
	else
		GetPostalCodeAndCity = Array("","")
	end if 
end function
Medlem sedan jan. 20013 582 inlägg
#18

Så här i Nobeltider: "ÄNTLIGEN!"

Tack som fan! :)

Mvh
Henrik

143 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)