webForumDet fria alternativet

Random-funktion

7 svar · 205 visningar · startad av LilleSkutt

LilleSkuttMedlem sedan feb. 2001265 inlägg
#1

Hallo.
Jag har lite problem med en funktion som ska returnera en slumpvis vald rad ur en textfil. Jag får inga felmeddelanden, men jag får inte heller någon utskrift.

Vad kan vara fel med koden:

Function getRandomRow(ByVal FILE)
    Dim objFSO, objFile

    set objFSO = Server.CreateObject("Scripting.FileSystemObject")
    If Not objFSO.FileExists(FILE) Then
        Response.Write "Filen hittades inte"
        Response.End
    End If

    set objFile = objFSO.OpenTextFile(FILE)

    Dim counter, arr()
    ReDim arr(20)
    counter = 0

    Do Until objFile.AtEndOfStream
        arr(counter) = objFile.ReadLine
        counter = counter + 1
    Loop

    objFile.Close
    set objFile = Nothing
    set objFSO = Nothing

    Dim intRow, strRow

    Randomize
    intRow = Int(Rnd * uBound(arr))
    strRow = arr(intRow)

    getRandomRow = strRow
End Function

------------------
---
/* LilleSkutt */

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Hur ser anropet till funktionen getRandomRow ut?

response.write getRandomRow("magdur.txt") & "<br>"

------------------
essentitia preter non sans multiplicandum

icaaqMedlem sedan okt. 20005 273 inlägg
#3

en fråga, om man skriver så här

    Do Until objFile.AtEndOfStream
        arr(counter) = objFile.ReadLine
        counter = counter + 1
    Loop

kommer inte arr() bli en enda lång rad med lästa rader...eller läggs det ett komma imellan alla lästa rader...automatiskt eller så ??

sen kan man väl göra så här istället
/r. om nu det kommer nåt imellan som skiljer texten åt...annars får man väl lägga dit ett komma....

Do Until objFile.AtEndOfStream
        arr(objFile.Line) = objFile.ReadLine
        Loop

:OO

------------------
http://free.webforum.nu/wf/Forum1/HTML/004045.html

[Redigerat av icaaq den 16 sep 2001]

LarsGMedlem sedan dec. 200012 464 inlägg
#4

raderna hamnar i olika element i arrayen så det är inget problem. Däremot så borde LilleSkutt lägga till en koll på att han inte får mer än 21 rader (eller göra redim i såfall).

Om man ändå skall läsa in hela filen så kan man skriva så här

arr = split(objFile.readall,vbCrLf)

(om man vill skriva ut en rad så måste man lägga dit en <br> )

------------------
essentitia preter non sans multiplicandum

LilleSkuttMedlem sedan feb. 2001265 inlägg
#5

Anropet sker precis så LarsG!

Jag kommer själv att sköta administrationen av de textfiler som kommer att läsas, så de kommer inte överstiga 21 rader... Men ditt förslag ska jag ändå gå över till, ser bättre ut och det är säkrare :)

Men jag gör väl inget fel i själva randomizen? Det verkar ju vara det som spökar...

Jag har ett nytt problem nu:
Jag sätter alltid Option Explicit i mina filer, och när jag sedan ska hämta in all information från en databas till en array, hur ska jag dimma den?!

Man kan ju inte bara sätta

Dim rows
rows = ConnectionObjekt.Execute(SQLquery).GetRows()

Eller hur?

------------------
---
/* LilleSkutt */

LarsGMedlem sedan dec. 200012 464 inlägg
#6

Vet du att du har exakt 21 rader i filen?

Ubound(arr) blir alltid 20 så det är nog bättre att använda denna

intRow = Int(Rnd * (counter-1))

------------------
essentitia preter non sans multiplicandum

LilleSkuttMedlem sedan feb. 2001265 inlägg
#7

Ok, det har du rätt i. Men om jag ska använda mig av Split(objFile.ReadAll, vbCrLf) istället måste jag ju unbounda :)

Du har inga förslag på hur jag ska göra med min andra fråga?

Går det att lägga in GetRows() i en icke-ReDimmad array?

------------------
---
/* LilleSkutt */

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Går det inte bra med

<% option explicit
dim arr,rs,...
'...
'...
arr = rs.getrows()
'...
'...
%>

?

------------------
essentitia preter non sans multiplicandum

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