Avatar billede dc Nybegynder
02. december 2002 - 18:48 Der er 11 kommentarer og
1 løsning

Læse en random linie fra en text fil og returnerer den.

Hvordan laver men en funktion, som kan finde antal linier en *.txt fil indeholder og returnere en random linie uden slutkarakterer som f.eks. Chr$(13) og Chr$(10)? Funktionen skal være public og en active-x dll.
Avatar billede joern Nybegynder
02. december 2002 - 19:31 #1
Hej.

Jeg kender ikke til at lave dll'er eller activeX, men det første ville jeg lave således:

Dim linie() As String
Dim tal, a As Integer    ' op til 32.000 eller må du bruge Long

Open sti & "\filnavn.txt" for Input As #1
  Do While EOF(1)=False
    Line Input #1, linie(a)
    a = a +1
    Redim Preserve linie(a + 1)
  Loop
Close #1

msgbox("Filen har " & a & " linier.")

tal = Int((a * Rnd) + 1)    ' Generate random value between 1 and a.

msgbox ("En tilfældig linie er: " & linie(tal))

M.v.h.  Jørn
Avatar billede martin_moth Mester
02. december 2002 - 19:33 #2
Public Function TælLinier(Filnavn As String) As String
  Dim i, j, k As Integer
  Dim strDummy As String
 
  j = FreeFile
 
'tæller linier
  Open Filnavn For Input As #j
  Do While Not EOF(j)
    Line Input #j, strDummy
    i = i + 1
  Loop
  Close #j
  MsgBox "Antal linier i " & Filnavn & " = " & i
 
'Henter en random string
  Open Filnavn For Input As #j
  For k = 1 To 1 + Int(Rnd * i)
    Line Input #j, strDummy
  Next k
  Close #j
 
  TælLinier = strDummy
End Function

'Test af funktion:
Private Sub Command1_Click()
  Dim strRandomString As String
  strRandomString = TælLinier("c:\sletmig.htm")
  MsgBox strRandomString
End Sub

Vælg ActiveXDLL når du starter VB ;o)
Avatar billede martin_moth Mester
02. december 2002 - 19:34 #3
Hov - nu kom joern mig i forkøbet ;-D
Avatar billede joern Nybegynder
02. december 2002 - 19:37 #4
Hej igen.

Det er lææænge siden jeg har lavet noget med random, helt tilbage til jeg brugte VB3  Her er en stump kode fra dengang.  Jeg synes nok der manglede noget, rnd skal jo tages af en værdi, i eksemplet bruger jeg sekunder.

  ran = Format(Time, "ss")
  Randomize
  For a = 0 To 15
      labtal(a).Caption = Int(10 * Rnd(ran))
      If (a + 1) / 4 = Int((a + 1) / 4) Then
        labtal(a).BackColor = QBColor(15)
        If Int(10 * Rnd(ran)) > hyp Then      'for at opnå 3 cifrede tal
            labtal(a).Caption = ""
            If opt = 3 Then labtal(a).BackColor = QBColor(7)
        End If
      End If
  Next

Det er fra et program der giver tilfældige tal til øvelse i regning, programmerne er Freeware.

http://www.jkfsoft.dk/regning.htm

M.v.h.  Jørn
Avatar billede martin_moth Mester
02. december 2002 - 19:49 #5
joern> dit eget forslag (der er magen til mit)
  Int((a * Rnd) + 1)
afleverer et "tilfældigt" tal mellem 1 og a. Der mangler ikke noget... Vil man gøre det mere "tilfældigt", kan man køre en randomize forinden.
Avatar billede joern Nybegynder
02. december 2002 - 20:44 #6
Martin >>

Ja, du har ret.  Jeg husker nu at programmet startede med samme værdier hver gang indtil jeg indførte at maskintiden forinden indgik i en randomize.
Nu må vi så høre hvad dc siger.    I et andet spørgsmål venter vi på Cole.
Det er jo ikke alle der har ADSL eller kabelmodem og hører et pling for hver ny mail.
Indtil jeg fik bredbånd for 5-6 uger siden var det sjældent jeg kunne komme til at svare på spørgsmål på Eksperten.  Der var svaret, når jeg med timers mellemrum loggede mig på.

M.v.h.  Jørn
Avatar billede martin_moth Mester
03. december 2002 - 09:49 #7
He he - ja, vi er hoppet på mange af de samme spørgsmål, vi to ;o)
Avatar billede dc Nybegynder
03. december 2002 - 22:30 #8
tak for hjælpen.
Avatar billede martin_moth Mester
04. december 2002 - 09:41 #9
PS: joerns løning vil have to pladser for meget i arrayet. Således vil tal(a) og tal(a-1) altid indeholde en tom streng når loopet er kørt...

Det vil sige i de tilfælde der tilfældigvis vælges den sidste eller næstsidste plads i arrayet som din random string, vil den fejlagtigt give en tom streng.

Det kan rettes ved af ændre
tal = Int((a * Rnd) + 1)
til
tal = Int(((a-2) * Rnd) + 1)
- eller ved at ændre koden i loopet.

Eller ved at bruge min kode, der ikke anvender et array ;o)
Avatar billede martin_moth Mester
04. december 2002 - 09:44 #10
PS:

tal = Int(((a-2) * Rnd) + 1)

vil give fejl, hvis der er mindre end 2 linier i text-filen - jeg vil anbefale at skrive koden i loopet om i stedet for, eller bruge løsningen uden array (så sparer du også at bruge hukommelse på et array fyldt med strings - slevom det næppe har nogen praktisk betydning ;o)
Avatar billede joern Nybegynder
04. december 2002 - 10:29 #11
Martin>>
Du er en grundig herre.  Jeg vil ikke lige nu bryde min morgen-hjerne med at gennemskue om du har helt ret.  Men jeg har erfaret at der hellere må være en plads for meget end én for lidt i et array.  I det aktuelle tilfælde kunne man jo kassere strengen hvis den var tom og 'tage en tur' til.

Tidligere var jeg selv tilbageholdende med at allokere array's og læste hellere fra disken en gang mere.  Men med 128 MB eller mere i maskinen (jeg har 512) har det sjældent betydning med hensyn til forbrug af hukommelse.  Til gengæld har det positiv betydning for afvikling af programmer og opdatering af lister m.v.  I hvert fald for den måde jeg opbygger mine applikationer på.  Jeg bruger meget mulighed for fritekst-søgning i databaser (fra ascii-filer) og det går hurtigere end du kan nå at sige 'juleaften'.

M.v.h.  Jørn
Avatar billede martin_moth Mester
04. december 2002 - 10:45 #12
He he - det ER navlepilleri (det med arrays kontra ikke-arrays)

Når EOF nås i dit loop:

Do While EOF(1)=False
    Line Input #1, linie(a)
    a = a +1
    Redim Preserve linie(a + 1)
Loop

forøger du a med 1, og redimmer derefter arrayet med a+1 - derved bliver de 2 sidste pladser i arrayet tomme...

Man kunne ændre dit loop en ganske lille smule:

a = -1
Do While EOF(1)=False
  a = a +1
  Redim Preserve linie(a)
  Line Input #1, linie(a)
Loop

Således forøges a og arrayet redimmes FØR der indlæses i det...

Og SÅ er denne tråd vist også slut!!! - over and out, og glædelig jul (vi mødes jo nok i et andet spørgsmål ;o)))
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