Avatar billede ducks Nybegynder
10. januar 2003 - 18:55 Der er 15 kommentarer og
4 løsninger

Hent fra bestemt linie i en txt fil

Hej

Jeg vil lave et program der skal sortere nogle URL's ud fra en txt fil, altså fx:

NAVN_1=Adresse
URL_1=www.addresse1.dk
TYPE_1=Søgemaskine
NAVN_2=Chat
URL_2=www.chat.dk
TYPE_2=Chat

Så skal den i en listbox liste alle NAVN_ og når man trykker på en bliver nogle andre felter udfylgt med infoen derom. Forstår i hvad jeg mener, og er det muligt at lave?
Avatar billede ducks Nybegynder
10. januar 2003 - 19:16 #1
Sagt på en anden måde, jeg vil lave en database med en txt fil.
Avatar billede _darkstar_ Nybegynder
10. januar 2003 - 20:10 #2
Hvis du er til Windows, kan du godt få Access til noget ligende, men tekstfilens format bliver nok et lidt andet. Det er dog stadigvæk tekst.
Avatar billede knico Nybegynder
10. januar 2003 - 20:16 #3
Det kan sagtens lade sig gøre ved at læse tekst-filen ind i henholdsvis listen og et array. Det eneste det kræver er at tekst-filen er konsistent for navn og adresse. Her er et lille prog. der laver det du vil:

Private myarr() As String

Private Sub Command1_Click()


Dim k As Integer
Dim addlist As Boolean

k = 0
addlist = False

Open "F:\adresser.txt" For Input As #1

Do Until EOF(1)
    If addlist = False Then
        Line Input #1, lineoftext
        List1.AddItem lineoftext
        addlist = True
    Else
        Line Input #1, lineoftext
        ReDim Preserve myarr(k)
        myarr(k) = lineoftext
        addlist = False
        k = k + 1
    End If

Loop

Close #1

End Sub

Private Sub List1_Click()
MsgBox List1.ListIndex
    Text1.Text = myarr(List1.ListIndex)
End Sub
Avatar billede martin_moth Mester
10. januar 2003 - 20:22 #4
Overvej evt. at bruge random access files, hvori du kan indlæse records - smart! Så kan du nappe lige den record fra din fil du ønsker, uden at skulle læse de første 1000 linier hvis du skal have fat i linie 1001

Åbne en typebestemt fil:
  Open Filnavn for RANDOM as filnummer Len=Recordlen)

Læse records til en variabel "Minvariabel" fra en typebestemt fil:
  Get #Filnummer, aktuelrecord, Minvariabel

Skrive records:
  Som at læse, skriv Put i stedet for Get

Mere om Rancom Access File (i modsætning til sekventielle filer):

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon98/html/vbconusingrandomfileaccess.asp
Avatar billede knico Nybegynder
10. januar 2003 - 21:09 #5
men hvis alle navne alligevel skal listes skal man jo alligevel læse filen. At arbejde med et array er vel også hurtigere end file i/o eller...?
Avatar billede martin_moth Mester
10. januar 2003 - 21:33 #6
Jeg ved ikke om alle navne skal listes - måske skal ducks kunne hente et bestemt navn direkte fra filen, uden at hente de andre samtidigt?
Jeg ville jo mene at det er hurtigere end at fylde et array med fx. 1000 strings - men må indrømme, at jeg ikke ved hvad der er hurtigst...

Det var nu også bare ment som en alternativ ide, som er smart, hvis der er behov for at tilgå bestemt data i en textfil :o)

Smag og behag :o))

/Martin
Avatar billede knico Nybegynder
10. januar 2003 - 21:40 #7
Du har selvfølgelig ret i at din metode vil være hurtigst, hvis der skal hentes oplysninger få gange, men hvis der efter at Navnene er listet hypigt skal hentes oplysniger, tror jeg arrayet er hurtigst.

Som du siger smag og behag + hvor i processen skal jeg spare tid.

/Kaj
Avatar billede ducks Nybegynder
10. januar 2003 - 21:53 #8
Jeg har kigget lidt på begge dele, tager nok lidt tid for at mig at skulle overskue det link, så det bliver ikke i dag med mindre jeg får et eksempel :)

Med hensyn til det andet indlæg, såvidt jeg kan se vil det så ikke bare skrive hele linien? Jeg har brug får den kun tager noget af det;

NAVN_1=Adresse
URL_1=www.addresse1.dk
TYPE_1=Søgemaskine
NAVN_2=Chat
URL_2=www.chat.dk
TYPE_2=Chat

Så kommer der til at stå i List1:

Adresse
Chat

og når man dobbeltklikker på Adresse kommer man ind på www.adresse1.dk. Og så skal man kunne vælge kun at se fx alle der er af typen Chat, evt også lidt tekst kunne være INFO_1=Info om noget, der kunne stå i en label når det pågældene var markeret i list1. Kræver det flere point, for jeg skal nok bruge en god forklaring?
Avatar billede martin_moth Mester
10. januar 2003 - 22:06 #9
For at nappe dele af en text-streng, brug en passende kombination af strengefunktionerne mid() og right() og left() og instr() og Trim() og LTrim() og RTrim() og Len()

fx:
  myarr(5) indeholder "URL_1 = www.addresse1.dk"

og
  LTrim(Mid(myarr(5), InStr(1, myarr(5), "=") + 1)) indeholder "www.addresse1.dk"

Du skriver: "Og så skal man kunne vælge kun at se fx alle der er af typen Chat"
Du gør dig selv en kæmpe tjeneste ved at bruge en database i stedet for en textfil. Der kan du med en SQL-sætning lave lige de udtræk du ønsker utroligt nemt.

Hvis du skal have hjælp til at starte et link i explorer osv, skal du nok starte et nyt spørgsmål med det :o)
Avatar billede martin_moth Mester
10. januar 2003 - 22:10 #10
PS: når jeg skriver, at du gør dig selv en kæmpe tjeneste ved at bruge en database i stedet for en textfil, så mener jeg ikke kæmpe.
Jeg mener mega kæmpe super tjeneste!!!

Databaser er skabt til det du vil - så hvorfor ikke bruge dem i stedet for en dum text-fil, hvor du skal lave de mest snørklede koderier med masser af kode for at gøre det du kan med en enkelt linie kode hvis du bruger en database...

VB snakker utroligt godt og problemfrit sammen med Access-databaser, så der er ingen problemer. Og at connecte til en database kræver ca. 5 linier kode, og så er det klaret.

Så min opfordring er, nu hvor jeg kan se hvad du vil med dit program: Brug en database - det er meget nemmere end du tror!
Avatar billede ducks Nybegynder
10. januar 2003 - 22:13 #11
Jajaja ;)

Kan man så ik lave det mere enkelt, fx opdele det med , og linieskift altså


Navn,adresse,info eller bare Navn,adresse - synes ihvert fald jeg har læst om en jer på eksperten der delte noget op med |
Avatar billede martin_moth Mester
10. januar 2003 - 22:21 #12
Øhh - ikke forstået? Dele op? Dataene er jo delt op, linie for linie, og hver linie er opdelt med et lighedstegn, så du kan skille det ad som jeg har vist...
Avatar billede knico Nybegynder
10. januar 2003 - 22:23 #13
Hvis du kun skal bruge det efter '=' kan du så ikke nøjes med at skrive det i linien i din tekstfil? I øvrigt er jeg enig med Martin i at en database må være det rigtigste.
Avatar billede martin_moth Mester
10. januar 2003 - 22:56 #14
Jeg har mistet overblikket - har du mere at spørge om?

Hvis du VIL beholde løsningen med en textfil, så brug en Random Acces File - efter lidt overvejelser synes jeg den løsning har MANGE fordele over en almindelig textfil. Se bare her:

Erklær en type

Type Link
  Linktype As string*10
  URL as String*100
  Kommentar as String*100
End Type

Herefter kan du skrive disse til en Random Acces File som jeg har vist tidligere i dette spørgsmål. Hvert Link vil blive gemt i hver sin Record, og du kan hente præcis den record du vil direkte fra filen, eller læse hele møget ind i et array a la knico's eksempel. Arrayet skal være af typen

  Dim myarray() as Link

Herefter kan du hente fx. link nummer X:

  myarray(X).Linktype    vil indeholde fx. "Chat"
  myarray(X).URL    vil indeholde fx. "www.adresse.dk"
  myarray(X).Kommentar    vil indeholde fx. "Ret godt link, bla bla"

Og du vil kunne vælge fx. alle poster af typen chat ved:

  For i = lbound(myarray) to ubound(myarray)
    if myarray(i).Linktype = "Chat" Then
      list.additem myarray(i).URL
    end if
  next i

Således kan brugeren vælge "Chat", og få en liste med alle URL'erne for de links der er gemt som typen Chat. Eller alle kommentarene. Eller begge dele...

Du har fået mere end rigeligt svar på dit oprindelige spørgsmål nu, vil jeg mene ;o)
Avatar billede ducks Nybegynder
10. januar 2003 - 23:07 #15
Vil bare holde mig til den lette løsning :)

knico, Kan man ikke lave det om, sådan at det først kommer der en linie i List1 med det man ser, og så anden linie en adresse i List2, så kunne List2 være skjult og når man så trykker på List1.ListIndex 1 åbner den List2.ListIndex 1
Avatar billede martin_moth Mester
11. januar 2003 - 01:23 #16
Den lette? Hvad mener du er den lette?

Jeg undrer mig over at du finder den absolut dårligste løsning for "den lette". Læs 2 minutter om random access files, og du ved alt hvad du behøver. Aller læs 5 minutter om access+VB, og du har den suverent bedste løsning. Men jeg har forstået at du ikke vil bruge en Access-database. Men hvad er der i vejen med mit foreslag fra 22:56:29 - du har jo alt koden? Du kan vel se det smarte i at definere sin egen type?
Avatar billede martin_moth Mester
11. januar 2003 - 01:37 #17
PS: Det du spørger efter 23:07:39 kan gøres såden her - når man klikker på et emne i list1 (som f.x. kunne være "Chat"), åbnes den tilsvarende adresse (som kunne være "www.adresse.dk"):

Private Sub List1_Click()
  OpenURL myarr(List1.ListIndex).URL
End Sub

OpenURL skal du så definere - men det hører vist ikke til i dette spørgsmål at åben internetadresser.

Prøv at bemærk hvor elegant ovenstående er - en linie, og ikke noget med skjulte listboxe eller andet pjat :o)
Avatar billede knico Nybegynder
11. januar 2003 - 08:49 #18
ducks>> du kan selvfølgelig godt sætte ind i skjulte kontroller. Det er generelt set ikke en god ide da kontroller optager en del 'plads' i dit program. At sætte det ind i et array er jo lidt det samme: Du har gemt hver linie og kalder den frem når du skal bruge den. Hvis du hellere vil det andet så kan du let lave koden om så det virker.
Avatar billede rynke10 Novice
11. januar 2003 - 13:11 #19
Det er meget nemmere med en database hvis du vil hente ting. Men hvis jeg forstår dig ret, vil du med en tekst-fil nemt kunne se/rette de informationer du henter. Det bliver lidt snørklet, men hvis du vil have din fil nøjagtig som du har skrevet


Dim strInd As String
Dim intpos As Integer
Open "c:\cnc\visual\navn.txt" For Input As #1
Do Until EOF(1)
Line Input #1, strInd
  If InStr(strInd, "NAVN") = 1 Then
  intpos = (InStr(strInd, "="))
  List1.AddItem Right(strInd, Len(strInd) - intpos)
  End If
  If InStr(strInd, "URL") = 1 Then
  intpos = (InStr(strInd, "="))
  List2.AddItem Right(strInd, Len(strInd) - intpos)
  End If
  If InStr(strInd, "TYPE") = 1 Then
  intpos = (InStr(strInd, "="))
  List3.AddItem Right(strInd, Len(strInd) - intpos)
  End If
Loop
Close #1
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