Gå til innhold

Hvordan hente en bestemt ting ut fra txt-fil


Anbefalte innlegg

Videoannonse
Annonse

Ganske enkelt. Først laster du alt inn i en array:

 

Dim Buff$, Filnavn$
Dim DataArray() As String, Tell&

Filnavn = App.Path & "\Data.txt"

Open Filnavn For Input As #1
Do Until EOF(1)
Line Input #1, Buff

ReDim Preserve DataArray(Tell)
DataArray(Tell) = Buff
Tell = Tell + 1
Loop
Close #1

' Arrayen er loaded inn, last inn dataen:

For Tell = LBound(DataArray) To UBound(DataArray)
Buff = DataArray(Tell)
If Mid(Buff, 1, 1) = "<" Then

Select Case LCase(Mid(Buff, 2, InStr(1, Buff, ">") - 2))
Case "navn"
Text1.Text = DataArray(Tell + 1)
Case "addresse"
Text2.Text = DataArray(Tell + 2)
End Select

End If
Next

Lenke til kommentar
  • 4 måneder senere...

Jeg brukte deler av koden din for å laste linjer i en tekstfil inn i en ComboBox. Men nå har jeg støtt på et problem.

 

Koden ligger i en prosedyre i en modul. Koden kjøres ved oppstart av programmet, og ved åpning av en form der man kan legge til/ta vekk linjer fra tekst-filen.

Problemet er at hver gang koden kjøres for 2. gang og mer, kommer det dobbelt opp med items i comboboxen.

 

Eksempel:

I liste.txt:

hei
hallo
hardware

 

I modulen:

Public Sub Listedata()
 Dim strBuff As String
 Dim strFilNavn As String
 
 strFilNavn = App.Path & "\liste.txt"

 Open strFilNavn For Input As #1 
     Do Until EOF(1)             
     Line Input #1, strBuff
     ReDim Preserve strListeArray(intTeller1)
     strListeArray(intTeller1) = strBuff
     intTeller1 = intTeller1 + 1
   Loop
     intTeller1 = intTeller1 - 1
 Close #1
End Sub

 

I formen:

Private Sub Form_Load()
 Dim intTeller2 As Integer
 
 comListe.Clear
 
 For intTeller2 = 0 To intTeller1
   comListe.AddItem (strListeArray(intTeller2))
 Next
End Sub

 

Regner med at det jeg må gjøre er å lage en løkke, og tømme hver "post" i arrayet (det går vel?). Søren, denne posten mista litt av meninga si nå, når jeg nesten svarte på mitt eget spørsmål.. :D

 

[OT]

Det er jo et kjempebra forum dette da, når man finner svar på spørsmålet sitt før man er ferdig å skrive det :D

[/OT]

 

Men det jeg også lurte på; fins det en enkelt kode som tømmer hele arrayet uten å bruke noen form for løkke? Noe på samme måte som å tømme combobox'en, combo1.clear.

 

EDIT: Glemte å si, variablene intteller1 og strlistearray blir deklarert public i modulen.

Endret av svamp
Lenke til kommentar

Løsningen er som du sa; å tømme arrayen. Dette kan gjøres ved bruk av syntaksen Erase. Legg følgende kode i begynnelsen av Listedata:

 

Erase strListeArray

 

[OT]

Å jo, dette er et bra forum. Det kan jeg si meg enig i. Jeg har selv opplevd å få svar på ett spørsmål bare 5-10 minutt etter jeg postet tråden. Imponerende!

[/OT]

Lenke til kommentar

Jeg slang sammen en liten sub for å slette linjer i combobokser og lagre endringen. Her er koden:

 

Public Sub DeleteLine(refComboBox As ComboBox, File As String, ItemIndex As Long)

Dim Tell&, Free&

' Først sletter vi linjen i comboboksen
refComboBox.RemoveItem ItemIndex

' Denne loop'en flytter alle elementene ett hakk ned
For Tell = ItemIndex + 1 To UBound(strListeArray)
   strListeArray(Tell - 1) = strListeArray(Tell)
Next

' Sletter så det siste elemetet totalt fra arrayen
ReDim Preserve strListeArray(UBound(strListeArray) - 1)

' Så lagrer vi endringen:
Free = FreeFile

Open File For Output As Free
   For Tell = LBound(strListeArray) To UBound(strListeArray)
       Print #Free, strListeArray(Tell)
   Next
Close Free

End Sub

 

Den brukes omtrent slik:

 

DeleteLine Combo1, "C:\test.txt", Combo1.ListIndex

Lenke til kommentar
  • 2 uker senere...

Hei..

 

På en måte samme tingen =)

 

og eg e nuub, skole greier, kan lite etc..

Så hvis noen gidd å ta seg litt tid for meg, vil eg bli veldig glad =)

 

Men se da! jeg har 3 text boxer, og 2 knapper.

 

textbox1: det er den text boxen all infoen skal komme inn i!

textbox 2 hører til kanpp 1, som da når eg trykker knapp 1, skal den se ka jeg har skrevet inn i textbox 2, så skal den se f.eks jeg skrev.. "test", da skal den

hente fra \rules\test.txt fram text som den skal plassere i text 1

 

Når eg trykker knapp 2, skal den hente ka eg skrev inn i textbox3, og da f.eks står det "test2", så skal den hente her, \sinfo\test2.txt

Og plassere dette i text box 1.

 

mvh fiji =)

Lenke til kommentar

Joda, det skulle ikke være noe problem. Først kaller vi de forskjellige kontrollene med noen mer intuitive navn, slik at det blir lettere å forstå koden.

 

txtInfo = Textbox 1

txtCommand1 = Textbox2

txtCommand2 = Textbox3

cmdCall1 = Knapp 1

cmdCall2 = Knapp 2

 

For å gi kontroller navn, trykker du på Properties vinduet og letter fram (Name). I tekstboksen ved siden av denne skriver du det nye navnet for kontrollen.

 

Etter dette kan du bruke følgende kode for å utføre oppgaven du ønsket:

 

' Denne metoden laster inn all data fra hvilken som helst fil.

Public Function LoadData(File As String) As String

Dim Free As Long

Free = FreeFile

Open File For Binary As #1
   LoadData = Space(LOF(1))
   Get #1, , LoadData
Close #1

End Function

' Denne metoden legger til en / i enden av strengen hvis den allerede ikke eksisterer.

Public Function GetFullPath(Path As String) As String

GetFullPath = Path & IIf(Right(GetFullPath, 1) = "/", "", "/")

End Function

Private Sub cmdCall1_Click()

If txtCommand1.Text = "test" Then
   ' App.Path returnerer stien til programmet. GetFullPath må brukes ettersom
   ' noen stier slutter med "/", mens andre ikke.
   txtInfo.Text = LoadData(GetFullPath(App.Path) & "rules\test.txt")
End If

End Sub

Private Sub cmdCall1_Click()

If txtCommand1.Text = "test2" Then
   txtInfo.Text = LoadData(GetFullPath(App.Path) & "sinfo\test2.txt")
End If

End Sub

 

mvh,

aadnk

Lenke til kommentar

Private Sub cmdCall1_Click()

If txtCommand1.Text = "test" Then
  ' App.Path returnerer stien til programmet. GetFullPath må brukes ettersom
  ' noen stier slutter med "/", mens andre ikke.
  txtInfo.Text = LoadData(GetFullPath(App.Path) & "rules\test.txt")
End If

End Sub

Private Sub cmdCall2_Click()
If txtCommand1.Text = "test" Then
  txtInfo.Text = LoadData(GetFullPath(App.Path) & "sinfo\test.txt")
End If

End Sub

 

Nå har jo jeg dette =)

(ps det du visste meg funka det, og kom litt på vei med noen andre ting etc.. )

Men så skule eg tilbake til de

txtCommand1

txtCommand2

Og ka dokkument den skal åpne! =)

istedenfor å lage en ny "kode" for hver fil som skal være mulig å åpne, så skal eg kunne åpne f.eks hei.txt, når eg skriver hei i det feltet!..

Asså, den texten man skriver, så skal den åpne den .txt filen som har et fil navn som matcher denne infoen den henter ut fra text boxene =)

 

mvh fiji

Lenke til kommentar

Er ganske enig i at det er mye bedre å ha en tekst boks og en knapp for begge tekstfilene. Det gjør programmet mye mer oversiktlig og enklere, og er også den måten jeg selv ville løst det på.

 

For å gjøre dette kan du fjerne txtCommand2, txtCall2 (og også eventuelt fjerne tallene etter txtCommand1 og txtCall1) og bruke denne koden:

 

Private Sub cmdCall1_Click()

Dim Path As String

Select Case txtCommand1.Text
Case "test"
   Path = "rules\test.txt"
Case "test2"
   Path = "sinfo\test2.txt"
End Select

txtInfo.Text = LoadData(GetFullPath(App.Path) & Path)

End Sub

Endret av aadnk
Lenke til kommentar

Ja så litt på den der og, er sånn "øvings greien" visser litt om!

 

Men synnes det blir et hælvete :p å skrive for sånn ca. 80 txt. filer, og en trigger for hver..

+ at eg da må senere redigere programmer hver gang i VB når eg adder en txt fil :S Noe som da blir kjipt...

 

Men ellers takk =)

 

Men vil helst ha det sånn at, skriver eg noe i txtCommand1 og så trykker på kanppen som står ved den, som da er, cmdCall1

Skal den ta texten fra txtcommand1 og så åpne en .txt fil i mappen \rules

skriver jeg Eirik åpner den Eirik.txt hvis den er der

skriver jeg hei åpner den hei.txt hvis den er der..

 

er det som passer for den, så skjer ingenting! =)

 

Klarte det selv! =) koden ble sånn =)

 

Private Sub cmdCall2_Click()
txtInfo.Text = LoadData(GetFullPath(App.Path) & "sinfo\" & txtCommand2.Text & ".txt")
End Sub

 

Egentlig ganske enkelt, men jeje.-.-. eg stressa med å få det til :p hele tiden et eller anna feil =) Men nå funker det =) takk for all hjelp =)

Endret av Fiji
Lenke til kommentar
  • 3 måneder senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...