03. juli 2002 - 19:28Der er
9 kommentarer og 2 løsninger
Koden til dette?
Hej
Jeg skal bruge koden til flgn. (burde ikke være svært at lave):
Den skal gennemsøge en variabel, hvor den skal finde ordet "link". Så skal den tjekke om det er ord der står bagefter "link" er det samme som(=) enten "paradoks", "passiv" eller "produktiv"
Hvordan gøres dette? Bare spørg hvis I ikke helt forstår spørgsmålet :-)
Hvad skal den returnere? Bare en boolsk værdi der siger om den har fundet det? En position i variablen hvor den har fundet det? Skal den finde flere forekomster i variablen?
Her er lidt kode til inspiration. Du skal bare lægge en lille løkke uden om samt addere en "if"
Private Sub simple_search()
Dim sSearch As String Dim sSearchWord As String Dim sWordAfterLink As String Dim myPos As Long
sSearch = "this is a link passiv" sSearchWord = "link"
' Get position where word "link" starts myPos = InStr(1, sSearch, sSearchWord)
' Get the word after word "link" - Assumed that words is separeted by space (chr(32)) sWordAfterLink = Mid(sSearch, myPos + Len(sSearchWord), InStr(myPos + Len(sSearchWord), sSearch, Chr(32))) MsgBox sWordAfterLink
set regExp = new RegExp regExp.Pattern = "link=(paradoks|passiv|produktiv)\b" regExp.Global = true regExp.IgnoreCase = true set matches = regExp.execute( strSearch ) for each match in matches msgbox match next set regexp = nothing set matches = nothing
set regExp = new RegExp regExp.Pattern = "link=(paradoks|passiv|produktiv)\b" regExp.Global = true regExp.IgnoreCase = true for each match in regExp.execute( strSearch ) msgbox match next set regexp = nothing
Denne funktion returnerer True hvis et af de 3 ord findes lige efter eller adskilt med et enkelt tegn efter 'link'. Hvis ikke, returnerer den False:
Private Function strChk(vStr As String) As Boolean Dim I As Integer, X As Integer strChk = False vStr = LCase(vStr) I = InStr(1, vStr, "link") If Not I = 0 Then X = InStr(I + 4, vStr, "passiv") If X - I - 3 = 1 Or X - I - 3 = 2 Then strChk = True X = InStr(I + 4, vStr, "paradoks") If X - I - 3 = 1 Or X - I - 3 = 2 Then strChk = True X = InStr(I + 4, vStr, "produktiv") If X - I - 3 = 1 Or X - I - 3 = 2 Then strChk = True End If End Function
Hm... tak for svarene alle sammen. Glemte desværre en vigtig detalje. De tre ord står i en tekstfil. Og den skal altså hente de 3 ord fra tekstfilken: dic.txt (det skal den jo så nok bare gøre inden).
Teksten i tekstfilen er inddelt således at de står lige under hinanden.
NB! driis - jeg har taget mig den frihed at "nappe" lidt af din funktion...Håber dette er ok. Vi kan jo dele points...
Private Sub search_string()
Dim fso As New FileSystemObject Dim f As File Dim txt As TextStream
Dim sSearchWord As String Dim sWord As String Dim arrSearchWords() As String Dim sSearchLine As String Dim sSep As String
Dim i As Long
' set all vars sSep = ";" sWord = "link" sSearchWord = "paradoks;passiv;produktiv"
' Load elements into array i = 0 Do While InStr(1, sSearchWord, sSep) > 0 ReDim Preserve arrSearchWords(i) arrSearchWords(i) = Mid(sSearchWord, 1, InStr(1, sSearchWord, sSep) - 1) sSearchWord = Mid(sSearchWord, InStr(1, sSearchWord, sSep) + 1) i = i + 1 Loop ReDim Preserve arrSearchWords(i) arrSearchWords(i) = sSearchWord
' define objects Set f = fso.GetFile("C:\testarea\dic.txt") Set txt = f.OpenAsTextStream(ForReading)
' Kill & Dispose filesystemobjects Set f = Nothing Set fso = Nothing
' loop through all lines in textstream and check Do While Not txt.AtEndOfStream sSearchLine = txt.ReadLine For i = LBound(arrSearchWords) To UBound(arrSearchWords) If strChk(sSearchLine, sWord, arrSearchWords(i)) = True Then MsgBox arrSearchWords(i) End If Next i Loop
' Close & Dispose textstreamobjects txt.Close Set txt = Nothing
End Sub
Private Function strChk(vStr As String, vWord As String, vSearchWord As String) As Boolean Dim i As Integer, X As Integer strChk = False vStr = LCase(vStr) i = InStr(1, vStr, vWord) If i > 0 Then X = InStr(i + Len(vWord), vStr, vSearchWord) If X - i - (Len(vWord) - 1) = 1 Or X - i - (Len(vWord) - 1) = 2 Then strChk = True End If End Function
NB! I forlængelse af mit nye foreslag - det forudsættes at ordet link kun forekommer een gang i hver linie. Endvidere vil jeg anbefale, at du måske smider lidt fejlhåndtering ind de relevante steder.....
Ved en nærmere læsning af hvad behovet er, slår det mig pludselig....
webwally: Er det korrekt forstået, at ordene produktiv, passiv mm står skrevet i en tekstfil og dem disse ord ønsker du at hente ind i fx. et array?
Hvis ja - så forsøg dig med denne kode:
Private Sub read_from_txt()
Dim fso As New FileSystemObject Dim f As File Dim txt As TextStream
Dim arrSearchWords() As String Dim sSearchLine As String
Dim i As Long
' define objects Set f = fso.GetFile("C:\testarea\dic.txt") Set txt = f.OpenAsTextStream(ForReading)
' Kill & Dispose filesystemobjects Set f = Nothing Set fso = Nothing
' loop through all lines in textstream and load elements into array Do While Not txt.AtEndOfStream ReDim Preserve arrSearchWords(i) arrSearchWords(i) = txt.ReadLine i = i + 1 Loop
' Close & Dispose textstreamobjects txt.Close Set txt = Nothing
' loop through all elements in array For i = LBound(arrSearchWords) To UBound(arrSearchWords) MsgBox arrSearchWords(i) Next i
hej igen igen....og her en funktion som returnerer en textstreng klippet ud af en linie, hvor ordet er link og et variabelt ord forekommer.....
håber dette kan hjælpe dig på vej......
Private Function getString(vStr As String, vWord As String, vSearchWord As String) As String Dim i As Integer, x As Integer
vStr = LCase(vStr) i = InStr(1, vStr, vWord) x = InStr(1, vStr, vSearchWord) If i > 0 And x > 0 Then getString = Mid(vStr, x, Len(vSearchWord)) Else getString = "N/A" End If
End Function
Synes godt om
Ny brugerNybegynder
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.