Stränghantering
Förord
En introduktion till strängar och stränghantering i Visual Basic. De vanliga funktionerna som Visual Basic tillhandahåller beskrivs och mer avancerade utökningar skapas för att göra stränghanteringen ännu mer kraftfull.I Visual Basic finns datatypen String som kan innehålla text. Datatypen kan innehålla ”oändligt” långa texter. Det som begränsar längden är endast datorns minne. Denna artikel tar upp grunderna i stränghantering och visar även några trevliga funktioner som är användbara i program som hanterar textsträngar.
En textsträng deklareras på följande sätt:
Vektorer och matriser kan också deklareras:
En textsträng kan tilldelas ett värde med den vanliga tilldelningsoperatorn, ’=’. Vektorer och matriser tilldelas värden på samma sätt.
Att slå ihop två textsträngar kallas för konkatenering. Det som händer är att den andra strängen läggs till på slutet av den första strängen.
I exemplet ovan användes konkateneringsoperatorn, ’&’. Det går även att använda ’+’ men för att förtydliga att det är fråga om strängar bör ’&’ användas.
Ofta behöver variabler innehållande tal, värden konverteras till strängar. Funktionen Str$(Number) konverterar ett tal oavsett datatyp till en textsträng. Observera att funktionen Str(Number) returnerar datatypen Variant och inte String. Använd därför Str$(Number) för att undvika ytterligare konverteringar mellan datatyper.
Observera att funktionen Str$(Number) lägger till ett blanksteg innan siffrorna. I vissa fall kan detta vara användbart och i andra fall inte.
Ibland kan en textsträng innehålla siffror som man vill konvertera till en mer lämplig datatyp, till exempel Integer. I detta fall kan man använda flera olika konverteringsfunktioner men innan dess måste man kontrollera så att textsträngen verkligen bara innehåller siffror. Om något annat tecken utöver siffror och vita tecken, blanksteg med mera, finns i strängen kommer konverteringsfunktionen att generera ett fel under körning. Visual Basic har en funktion IsNumeric(Expression) som går att använda i detta fall.
I ovanstående exempel får variabeln MyInteger värdet ’123’ förutsatt att all kod ovan har körts. För övriga datatyper av numerisk typ finns speciella konverteringsfunktioner.
För ovanstående funktioner behöver kontroller göras innan konverteringen för att undvika fel under körning.
Det är vanligt att man vill se om en viss text finns i en textsträng. Visual Basic har tre funktioner för detta, InStr, InStrB och InStrRev. Alla tre funktioner tar fyra argument varav två är valfria.
[Start] – Valfritt argument som anger var i strängen som sökandet ska börja. Första platsen i strängen har Start = 1. Det fördefinierade värdet på Start är 1 och InStr börjar därför söka längst till vänster i textsträngen.
[String1] – Den textsträng där funktionen ska söka.
[String2] – Den textsträng som funktionen ska leta efter i [String1].
[Compare As VbCompareMethod = vbBinaryCompare] – Anger på vilket sätt som Visual Basic ska leta. VbCompareMethod innehåller tre olika möjliga värden: vbBinaryCompare, vbDatabaseCompare och vbTextCompare. I det här fallet är bara vbBinaryCompare och vbTextCompare intressanta. Skillnaden mellan dessa är att vbTextCompare inte tar hänsyn till stora och små bokstäver. ’A’ är alltså samma sak som ’a’ i det fallet. vbBinaryCompare är standardvärdet och stora och små bokstäver har betydelse.
InStr returnerar den position i [String1] som [String2] hittades. Fanns inte [String2] i [String1] returneras 0.
Skillnaden mellan InStr, InStrB och InStrRev är att InStrB returnerar den byteposition som första matchningen hade istället för textpositionen. InStrRev söker från höger till vänster i strängen istället för från vänster till höger.
Vid vissa tillfällen kan en textsträng behöva delas upp i flera textsträngar. Det finns tre sorters uppdelningsfunktioner av strängar i Visual Basic, Left, Right och Mid. Alla tre finns i fyra olika versioner, för Left är det:
De två första returnerar ett visst antal tecken medan de två sista returnerar ett visst antal bytes. För Mid tillkommer även en positionsangivelse efter strängen bland argumenten som anger vilken position delsträngen ska börja på. Även här är det bra att lägga till ’$’ efter funktionen för att slippa konvertering från Variant till String.
Left fungerar så att den returnerar ett antal tecken med början längst till vänster i strängen. Right börjar från höger och går åt vänster medan Mid börjar på den position som anges och går åt höger.
Om vi nu återgår till problemet med det inledande blanksteget som tillkom vid konvertering från ett nummer till en sträng med hjälp av funktionen Str$() så kan man använda Mid för att bli av med detta.
Ovanstående kan förkortas till följande eftersom Mid börjar längst till vänster om startpositionen utelämnas:
Dessa funktioner kan kombineras med InStr för att dela upp strängen vid ett visst tecken eller annan sträng.
- 1 behövs för att ’,’ inte ska komma med.
Visual Basic har ett flertal andra strängfunktioner som kan vara användbara.
Det finns fler funktioner än ovanstående. Titta i Object Browser under Strings.
De funktioner som har visats innan har varit funktioner som Visual Basic har inbyggt. I många fall kan det vara smidigt att utöka dessa funktioner med egna funktioner som liknar men har lite mer funktionalitet. Jag tänkte visa tre funktioner som jag tycker är mycket användbara vid stränghantering.
Den första är en modifikation på Left som returnerar en delsträng till ett visst tecken eller sträng:
LeftString kan utökas för att ta en startposition och en jämförelsetyp som argument med vilka man kan ändra uppförande för funktionen.
Den andra funktionen är en splitfunktion för en sträng som kan användas när en sträng ska delas upp i flera strängar och placeras i olika variabler som inte är en vektor.
SplitString kan också anpassas för startposition och jämförelsetyp. Dessutom kan den modifieras så att AtString tas bort vilket kan vara bra om flera variabler är lagrade i text och skilda åt med ett specialtecken.
Den tredje funktionen ersätter texten mellan två strängar oavsett vad den innehåller.
Även denna funktion kan anpassas som de övriga. Det går även att lägga till funktionalitet som ersätter alla förekomster av det sökta strängparet samt val för att ta bort sökorden eller ej.
Det finns oändligt med möjligheter att göra speciella textfunktioner i Visual Basic. Även om funktionsanrop tar lite längre tid så gör funktioner som de ovan det mycket lättare att se vad det är man gör med textsträngen. Speciellt när man återgår till koden efter en tid, kanske för att leta efter en bugg eller för att utöka funktionen. Ett viktigt tips för att inte försämra prestandan onödigt mycket är att skicka alla textsträngar till funktionerna som referens. Skickas de utan referens görs en kopia vilket kan ta tid vid riktigt långa textsträngar, till exempel innehåll i filer med mera. Med argument som referenser är det även möjligt att ändra argumenten i funktionen och på så sätt returnera flera värden från samma funktion. Detta utnyttjas både i SplitString och ReplaceBetween.
Jag hoppas att denna korta introduktion till strängar i Visual Basic har gett dig lite insikt i hur kraftfulla de funktioner som finns i Visual Basic är samt vad som är möjligt att skapa själv utifrån dessa. Ett första steg är att göra om de tre ovanstående så att de fungerar från höger till vänster istället för som nu från vänster till höger. Spara dessa funktioner i en modul som du sedan lägger till i alla dina projekt som behöver stränghantering så kan du enkelt utnyttja funktionerna igen samtidigt som förrådet byggs ut hela tiden.
Deklaration
En textsträng deklareras på följande sätt:
Dim MyText As String
Vektorer och matriser kan också deklareras:
Dim MyTextVector(1 To 6) As String
Dim MyTextMatrix(1 To 6, 1 To 6) As String
Tilldelning
En textsträng kan tilldelas ett värde med den vanliga tilldelningsoperatorn, ’=’. Vektorer och matriser tilldelas värden på samma sätt.
MyText = ”En textsträng”
MyTextVector(1) = ”En”
MyTextVector(2) = ” ”
MyTextVector(3) = ”textsträng ”
MyTextVector(4) = ” ”
MyTextVector(5) = ”i”
MyTextVector(6) = ” en vektor.”
MyTextMatrix(1, 1) = ”Uppe till vänster i matrisen.”
MyTextMatrix(6, 6) = ”Nere till höger i matrisen.”
Konkatenering
Att slå ihop två textsträngar kallas för konkatenering. Det som händer är att den andra strängen läggs till på slutet av den första strängen.
MyText = ”Första strängen” & ”, andra strängen”
I exemplet ovan användes konkateneringsoperatorn, ’&’. Det går även att använda ’+’ men för att förtydliga att det är fråga om strängar bör ’&’ användas.
Konverteringar
Ofta behöver variabler innehållande tal, värden konverteras till strängar. Funktionen Str$(Number) konverterar ett tal oavsett datatyp till en textsträng. Observera att funktionen Str(Number) returnerar datatypen Variant och inte String. Använd därför Str$(Number) för att undvika ytterligare konverteringar mellan datatyper.
MyText = Str$(123) ’MyText innehåller nu strängen ” 123”
Observera att funktionen Str$(Number) lägger till ett blanksteg innan siffrorna. I vissa fall kan detta vara användbart och i andra fall inte.
Ibland kan en textsträng innehålla siffror som man vill konvertera till en mer lämplig datatyp, till exempel Integer. I detta fall kan man använda flera olika konverteringsfunktioner men innan dess måste man kontrollera så att textsträngen verkligen bara innehåller siffror. Om något annat tecken utöver siffror och vita tecken, blanksteg med mera, finns i strängen kommer konverteringsfunktionen att generera ett fel under körning. Visual Basic har en funktion IsNumeric(Expression) som går att använda i detta fall.
Dim MyInteger As Integer
If IsNumeric(MyText) Then
MyInteger = CInt(MyText)
End If
I ovanstående exempel får variabeln MyInteger värdet ’123’ förutsatt att all kod ovan har körts. För övriga datatyper av numerisk typ finns speciella konverteringsfunktioner.
Function CBool(Expression) As Boolean
Function CByte(Expression) As Byte
Function CCur(Expression) As Currency
Function CDate(Expression) As Date
Function CDbl(Expression) As Double
Function CDec(Expression)
Function CInt(Expression) As Integer
Function CLng(Expression) As Long
Function CSng(Expression) As Single
Function CStr(Expression) As String
Function CVar(Expression)
Function CVDate(Expression)
Function CVErr(Expression)
För ovanstående funktioner behöver kontroller göras innan konverteringen för att undvika fel under körning.
Sökning i textsträngar
Det är vanligt att man vill se om en viss text finns i en textsträng. Visual Basic har tre funktioner för detta, InStr, InStrB och InStrRev. Alla tre funktioner tar fyra argument varav två är valfria.
Function InStr([Start], [String1], [String2], [Compare As VbCompareMethod = vbBinaryCompare])
[Start] – Valfritt argument som anger var i strängen som sökandet ska börja. Första platsen i strängen har Start = 1. Det fördefinierade värdet på Start är 1 och InStr börjar därför söka längst till vänster i textsträngen.
[String1] – Den textsträng där funktionen ska söka.
[String2] – Den textsträng som funktionen ska leta efter i [String1].
[Compare As VbCompareMethod = vbBinaryCompare] – Anger på vilket sätt som Visual Basic ska leta. VbCompareMethod innehåller tre olika möjliga värden: vbBinaryCompare, vbDatabaseCompare och vbTextCompare. I det här fallet är bara vbBinaryCompare och vbTextCompare intressanta. Skillnaden mellan dessa är att vbTextCompare inte tar hänsyn till stora och små bokstäver. ’A’ är alltså samma sak som ’a’ i det fallet. vbBinaryCompare är standardvärdet och stora och små bokstäver har betydelse.
InStr returnerar den position i [String1] som [String2] hittades. Fanns inte [String2] i [String1] returneras 0.
If InStr(”Strängen vi söker i”, ”söker”) <> 0 Then
’"söker" fanns i första strängen
End If
Skillnaden mellan InStr, InStrB och InStrRev är att InStrB returnerar den byteposition som första matchningen hade istället för textpositionen. InStrRev söker från höger till vänster i strängen istället för från vänster till höger.
Dela upp strängar eller ta ut en del av en sträng
Vid vissa tillfällen kan en textsträng behöva delas upp i flera textsträngar. Det finns tre sorters uppdelningsfunktioner av strängar i Visual Basic, Left, Right och Mid. Alla tre finns i fyra olika versioner, för Left är det:
Function Left(String, Length As Long)
Function Left$(String As String, Length As Long) As String
Function LeftB(String, Length As Long)
Function LeftB$(String As String, Length As Long) As String
De två första returnerar ett visst antal tecken medan de två sista returnerar ett visst antal bytes. För Mid tillkommer även en positionsangivelse efter strängen bland argumenten som anger vilken position delsträngen ska börja på. Även här är det bra att lägga till ’$’ efter funktionen för att slippa konvertering från Variant till String.
Left fungerar så att den returnerar ett antal tecken med början längst till vänster i strängen. Right börjar från höger och går åt vänster medan Mid börjar på den position som anges och går åt höger.
Om vi nu återgår till problemet med det inledande blanksteget som tillkom vid konvertering från ett nummer till en sträng med hjälp av funktionen Str$() så kan man använda Mid för att bli av med detta.
MyText = Mid(Str$(MyInteger),1,2)
Ovanstående kan förkortas till följande eftersom Mid börjar längst till vänster om startpositionen utelämnas:
MyText = Mid(Str$(MyInteger),2)
Dessa funktioner kan kombineras med InStr för att dela upp strängen vid ett visst tecken eller annan sträng.
MyText = ”Det här ska komma med, men inte det här.”
MyText = Left(MyText, InStr(MyText, ”,”) - 1)
- 1 behövs för att ’,’ inte ska komma med.
Andra strängfunktioner
Visual Basic har ett flertal andra strängfunktioner som kan vara användbara.
Function Chr$(CharCode As Long) As String
– Kan användas för att skapa tecken som inte kan skrivas i en vanlig textsträng, till
exempel ’”’. ’”’ har CharCode = 34.
Function Join(SourceArray, [Delimiter]) As String
– Skapar en textsträng av en vektor eller matris där [Delimiter] används för att
skilja de olika värdena åt i SourceArray.
Function LCase$(String As String) As String
– Returnerar strängen String i Lower Case, det vill saga i gemener.
Function Len(Expression)
– Returnerar antalet tecken i textsträngen.
Function LTrim$(String As String) As String
– Returnerar strängen String utan inledande blanksteg. Kan användas för att ta bort
det inledande blanksteget som funktionen Str$ gav.
Function Replace(Expression As String, Find As String, Replace As String, _
[Star As Long = 1], [Count As Long = -1], _
[Compare As VbCompareMethod = vbBinaryCompare]) As String
– Ersätter en viss text med en annan.
Function RTrim$(String As String) As String
– Samma som LTrim$ men från höger istället.
Function StrReverse(Expression As String) As String
– Vänder på en sträng.
Function Trim$(String As String) As String
– Tar bort blanksteg innan och efter i en sträng. Fungerar som om man hade kört
LTrim$ och RTrim$ på strängen.
Function UCase$( String As String) As String
– Returnerar strängen i Upper Case.
Det finns fler funktioner än ovanstående. Titta i Object Browser under Strings.
Avancerade strängfunktioner
De funktioner som har visats innan har varit funktioner som Visual Basic har inbyggt. I många fall kan det vara smidigt att utöka dessa funktioner med egna funktioner som liknar men har lite mer funktionalitet. Jag tänkte visa tre funktioner som jag tycker är mycket användbara vid stränghantering.Den första är en modifikation på Left som returnerar en delsträng till ett visst tecken eller sträng:
Public Function LeftString(ByRef MainString As String, ByRef EndString As String) As String
'Börja med att se om EndString finns i MainString
Dim position As Long
position = InStr(MainString, EndString)
If position <> 0 Then
'Den fanns, returnera delen framför i MainString
LeftString = Left(MainString, position - 1)
Else
'Den fanns inte, returnera MainString
LeftString = MainString
End If
End Function
LeftString kan utökas för att ta en startposition och en jämförelsetyp som argument med vilka man kan ändra uppförande för funktionen.
Den andra funktionen är en splitfunktion för en sträng som kan användas när en sträng ska delas upp i flera strängar och placeras i olika variabler som inte är en vektor.
Public Function SplitString(ByRef MainString As String, ByRef AtString) As String
'Börja med att se om AtString finns i MainString
Dim position As Long
position = InStr(MainString, AtString)
If position <> 0 Then
'Den fanns, returnera delen efter i MainString och korta av MainString
SplitString = Left(MainString, position - 1)
MainString = Mid(MainString, position)
Else
'Den fanns inte, returnera en tom sträng
SplitString = ""
End If
End Function
SplitString kan också anpassas för startposition och jämförelsetyp. Dessutom kan den modifieras så att AtString tas bort vilket kan vara bra om flera variabler är lagrade i text och skilda åt med ett specialtecken.
Den tredje funktionen ersätter texten mellan två strängar oavsett vad den innehåller.
Public Function ReplaceBetween(ByRef MainString As String, _
ByRef FirstString As String, ByRef SecondString As String, _
ByRef WithString As String) As String
'Börja med att se om FirstString finns i MainString
Dim position1 As Long
position1 = InStr(MainString, FirstString)
If position1 <> 0 Then
'Den fanns, se om SecondString finns
Dim length As Long
length = Len(FirstString)
Dim position2 As Long
position2 = InStr(position1 + length, MainString, SecondString)
If position2 <> 0 Then
'SecondString fanns efter FirstString
'Returnera den gamla texten och ersätt den med den nya
ReplaceBetween = Mid(MainString, position1 + length, position2 - position1 - length)
MainString = Left(MainString, position1 + length - 1) & WithString & Mid(MainString, position2)
Else
'SecondString fanns inte efter FirstString, gör ingenting
ReplaceBetween = ""
End If
Else
'FirstString fanns inte, gör ingenting
ReplaceBetween = ""
End If
End Function
Även denna funktion kan anpassas som de övriga. Det går även att lägga till funktionalitet som ersätter alla förekomster av det sökta strängparet samt val för att ta bort sökorden eller ej.
Avslutning
Det finns oändligt med möjligheter att göra speciella textfunktioner i Visual Basic. Även om funktionsanrop tar lite längre tid så gör funktioner som de ovan det mycket lättare att se vad det är man gör med textsträngen. Speciellt när man återgår till koden efter en tid, kanske för att leta efter en bugg eller för att utöka funktionen. Ett viktigt tips för att inte försämra prestandan onödigt mycket är att skicka alla textsträngar till funktionerna som referens. Skickas de utan referens görs en kopia vilket kan ta tid vid riktigt långa textsträngar, till exempel innehåll i filer med mera. Med argument som referenser är det även möjligt att ändra argumenten i funktionen och på så sätt returnera flera värden från samma funktion. Detta utnyttjas både i SplitString och ReplaceBetween.Jag hoppas att denna korta introduktion till strängar i Visual Basic har gett dig lite insikt i hur kraftfulla de funktioner som finns i Visual Basic är samt vad som är möjligt att skapa själv utifrån dessa. Ett första steg är att göra om de tre ovanstående så att de fungerar från höger till vänster istället för som nu från vänster till höger. Spara dessa funktioner i en modul som du sedan lägger till i alla dina projekt som behöver stränghantering så kan du enkelt utnyttja funktionerna igen samtidigt som förrådet byggs ut hela tiden.
0 Kommentarer