Gå til innhold

Få til å lese fra en eksakt linje i en .txt?


Anbefalte innlegg

Ach, før jeg spør mye her nå... Håper jeg er tilgitt!

 

Jeg driver å skal la programmet mitt instille seg, i forhold til en .txt fil (egentlig .ini)

 

La meg vise koden:

'Check if the options has been set
       If System.IO.File.Exists("c:\options.ini") Then

           Dim file As New System.IO.StreamReader("c:\options.ini")
           Dim oneLine As String
           oneLine = file.ReadLine()


           If oneLine = "Ini? = Yes" Then
               MessageBox.Show("Working..!") 'Bare for å sjekke om at koden funker
               If oneLine = "" Then [COLOR=green]'<---- Her må det noe inn[/COLOR]
               Else
               End If

           Else
               MessageBox.Show("It seems that the options file has been corrupted. Please run the wizard again!")
           End If
       Else : MessageBox.Show("Your settings has not been set yet. Please run the Wizard!")
       End If
   End Sub

 

.ini fila ser slik ut innvendig:

Ini? = Yes

FW = 2.0

MB = TA-082 or above

VE = UK

######################

 

Så, jeg får jo til å lese fra første linja.. Men hvordan skal jeg f.eks få til å lese akkurat fra linje 3? (MB = TA-082 or above)

 

Setter pris på alle svar! :)

Lenke til kommentar
Videoannonse
Annonse
Do
 Dim line As String = file.ReadLine()

 If line Is Nothing Then Exit Do

 Dim pos As Integer = line.IndexOf("=")

 If pos = -1 Then Throw New Exception("Invalid INI file format")

 Dim line_start As String = line.SubString(0, pos - 1).Trim()
 Dim line_end As String = line.SubString(pos + 1).Trim()
 
 ' line_start er nå det som står foran =
 ' line_end er nå det som står etter =
Loop

Endret av GeirGrusom
Lenke til kommentar
Kan du forklare litt hvordan den der fungerer..? :)

9007629[/snapback]

 

Bedre forslag; Prøv å kommentere den selv. Og så poster du koden her med kommentarer. Så kan vi komme med tilbakemelding. Dermed får du litt trening på å lære å lese kode selv, samtidig som vi får luket ut eventuelle feil som du gjør.

Endret av jorn79
Lenke til kommentar

Jeg har forsøkt å kommentere noe, men det er jo begrenset hva en kan forklare på såpass få linjer. Jeg er for øvrig enig med jorn79 - prøv først selv!

Klikk for å se/fjerne innholdet nedenfor
Do

    ' Hent den neste linjen

    Dim line As String = file.ReadLine()

 

    ' Se om linjen ikke er satt (dette inntreffer når vi har nådd slutten av filen)

    If line Is Nothing Then Exit Do ' Gå til linjen NEDENFOR Loop-nøkkelordet

 

    ' Se hvilken posisjon "="-karakteren har

    Dim pos As Integer = line.IndexOf("=")

 

    ' Dersom den ikke eksisterer, er INI-formatet ungyldig

    If pos = -1 Then Throw New Exception("Invalid INI file format")

 

    ' Hent all tekst FØR "="-karakteren. I tillegg fjerner vi all unødvendig mellomrom

    Dim line_start As String = line.Substring(0, pos - 1).Trim()

 

    ' Hent all tekst ETTER "="-karakteren.

    Dim line_end As String = line.Substring(pos + 1).Trim()

 

    ' line_start er nå det som står foran =

    ' line_end er nå det som står etter =

 

    ' Hopper tilbake til Do-nøkkelordet helt til topps

Loop

 

For øvrig ville jeg selv gjort dette på følgende måte:

Klikk for å se/fjerne innholdet nedenfor
Public Function ReadIni(ByVal File As String) As Dictionary(Of String, String)

 

    ' Det er ofte lurt å la inndata være en Stream da det muliggjør for langt mer

    ' fleksibel prossering (kryptering, komprimering, minne-lagring, nettverk, ect.)

    Using sFile As New IO.FileStream(File, IO.FileMode.Open) ' Åpner filen

        ReadIni = ReadIni(sFile)

    End Using ' Her kalles Dispose automatisk

 

End Function

 

Public Function ReadIni(ByVal Stream As IO.Stream) As Dictionary(Of String, String)

 

    ' Strømleseren (håndterer karaktersett (ANSI i dette tilfellet) og linjeterminering)

    Dim Reader As New IO.StreamReader(Stream, System.Text.Encoding.Default)

    Dim Line As String, Parts() As String

 

    ' Gjør klar returobjektet (Dictionary med strengnøkler og strengverdier)

    ReadIni = New Dictionary(Of String, String)

 

    ' Gjenta koden inntil vi har nådd slutten (ReadLine returnerner Nothing i så fall)

    Do Until TryGet(Reader.ReadLine, Line) Is Nothing

        ' Split deler opp linjen der "=" befinner seg. Oppdelingen er begrenset til

        ' maksimalt to deler, og vi sjekker hvorvidt vi har begge før vi fortsetter.

        If TryGet(Split(Line, "=", 2), Parts).Length = 2 Then

            ' Legg til nøkkel (navn på variabel - det som kommer før =) og verdi

            ReadIni.Add(Parts(0).Trim, Parts(1).Trim)

        End If

    Loop

 

End Function

 

' Liten og lur funksjon som gjør det mulig å presse flere linjer sammen til én.

Private Function TryGet(Of T)(ByVal Value As T, ByRef Storage As T) As T

    Storage = Value : Return Value

End Function

 

Fordelen er da at du enkelt kan hente ut hvert verdisett uten å måtte tenke på rekkefølgen:

Dim IniFile As Dictionary(Of String, String) = ReadIni("C:\Test.ini")

Dim Index As Integer

 

' Hent en viss verdi

MessageBox.Show(IniFile("hallo"))

 

' Hent det tredje elementet

For Each Item As String In IniFile.Values

    If Index = 2 Then MessageBox.Show(Item)

    Index += 1

Next

Den beste metoden er imidlertid å benytte de innebyggede APIene for å lese og skrive til INI-filer. Det er nemlig ikke alltid slik at INI-filene er lagret på harddisken - ofte kan de være lagret i en hurtibuffer (minnet eller registeret), og det tar ikke koden ovenfor hensyn til. Du kan finne en implementasjon for VB.net her.

Endret av aadnk
Lenke til kommentar
Jeg driver å skal la programmet mitt instille seg, i forhold til en .txt fil (egentlig .ini)

9007028[/snapback]

Jeg tar dette med APIene tilbake. Den beste måten er utvilsomt å bruke den innebyggede innstillingskomponenten i Visual Studio. Gå til My Project -> Settings. Legg til alle innstillingene programmet behøver ved å skrive inn dets navn under Name, type (om det er tekst, tall, sannhet, ect.) under Type, Scope til Application om du vil innstillingen skal være Read-Only samt standardverdi under Value. For å bruke disse innstillingene, bruker du My.Settings-navneområdet:

' Sett en verdi

My.Settings.Test = "Hallo verden!"

 

' Hent verdi

MessageBox.Show(My.Settings.Test)

Enklere kan det nesten ikke bli.

Lenke til kommentar
(...) men til andre ting, fortrinnsvis fordi .ini filer er enklere å forstå en XML filer.

9008592[/snapback]

Enig i den, ja. Det er nokså irriterende at Microsoft har totalt oversett INI-filer til fordel for XML i .NET, kun for buzzword-kompatibilitet og utfasing av et helt kurant format. Det hele ligner en besettelse, spør du meg. :no:

Lenke til kommentar
Enig i den, ja. Det er nokså irriterende at Microsoft har totalt oversett INI-filer til fordel for XML i .NET, kun for buzzword-kompatibilitet og utfasing av et helt kurant format. Det hele ligner en besettelse, spør du meg.  :no:

9008638[/snapback]

 

Konfigurasjonsfiler er jo faktisk en av de få tingene XML er egnet for... :tease:

Lenke til kommentar
Konfigurasjonsfiler er jo faktisk en av de få tingene XML er egnet for...  :tease:

9008690[/snapback]

Nja, hvor mye tjener en egentlig på å konvertere til XML? Når alt kommer til alt er begge tekstformater (en må derfor inn med ekstra tolking for å støtte flere datatyper), og standardisert til den grad de er implementert på noenlunde samme måte (via et API). Joda, XML er langt mer allsidig og kan lagre mer komplekse strukturer enn INI, men for en enkelt tekstnøkkel-basert konfigurasjonsfil (med seksjoner) er mer enn det neppe nødvendig. Men såklart, manglende støtte for INI-filer er et problem.

 

I alle tilfeller tror jeg du bør lese innlegget mtt igjen. Jeg erkjente kun at INI-filer var lettere å forstå enn XML, og at XML i seg selv er generelt sett overhypet.

Endret av aadnk
Lenke til kommentar
Konfigurasjonsfiler er jo faktisk en av de få tingene XML er egnet for...  :tease:

9008690[/snapback]

Nja, hvor mye tjener en egentlig på å konvertere til XML? Når alt kommer til alt er begge tekstformater (en må derfor inn med ekstra tolking for å støtte flere datatyper), og standardisert til den grad de er implementert på noenlunde samme måte (via et API). Joda, XML er langt mer allsidig og kan lagre mer komplekse strukturer enn INI, men for en enkelt tekstnøkkel-basert konfigurasjonsfil (med seksjoner) er mer enn det neppe nødvendig. Manglende støtte er selvsagt et problem,

 

I alle tilfeller tror jeg du bør lese innlegget mtt igjen. Jeg erkjente kun at INI-filer var lettere å forstå enn XML, og at XML i seg selv er generelt sett overhypet.

9009077[/snapback]

 

Har du sett på hvor mange ting man kan konfigurere i .Net? Vi snakker ikke lengre om "enkle" konfigurasjonsfiler. Vi snakker ikke lengre om bare seksjoner, men mange nivåer av seksjoner. Og mange nivåer av konfigurasjonsfiler. Noen filer kan override visse seksjoner, etc. Dette skal også valideres. XML støtter allerede alt dette. .Config filene er også ment til en viss grad å erstatte registry.

 

Men vi er begge enige i at XML er overhypet :)

Lenke til kommentar
Jeg driver å skal la programmet mitt instille seg, i forhold til en .txt fil (egentlig .ini)

9007028[/snapback]

Jeg tar dette med APIene tilbake. Den beste måten er utvilsomt å bruke den innebyggede innstillingskomponenten i Visual Studio. Gå til My Project -> Settings. Legg til alle innstillingene programmet behøver ved å skrive inn dets navn under Name, type (om det er tekst, tall, sannhet, ect.) under Type, Scope til Application om du vil innstillingen skal være Read-Only samt standardverdi under Value. For å bruke disse innstillingene, bruker du My.Settings-navneområdet:

' Sett en verdi

My.Settings.Test = "Hallo verden!"

 

' Hent verdi

MessageBox.Show(My.Settings.Test)

Enklere kan det nesten ikke bli.

9008520[/snapback]

Jeg må si at My.Settings greia var mye enklere! Men, tror jeg kommer til å bruke .ini filer litt også... :) Skal se om jeg får til de funksjonene dere har postet til meg! Tusen takk for svar! :)

Jeg lurer på en ting, disse My.Settings greiene, lagrer det seg i selve programmet mitt eller som egen fil?

Endret av AnaXyd
Lenke til kommentar

Jeg har ikke mulighet til å teste nå, men du kan jo legge programfilen din (kun .exe-filen) i en egen mappe, starte den, gjøre noe som vil føre til at innstillingene blir lagret, og så se om det kom en ekstra fil i mappen.

Endret av Degeim
Lenke til kommentar

Har lett litt på MSDN (blogg) nå, og jeg tror brukerdefinerte innstillinger (den jeg nevnte tidligere angår applikasjonsinnstillinger - altså de som kun er lesbare) lagres i en user.config-fil, som regel etsteds i følgende mappe:

C:\Documents and Settings\<username>\Application Data\<company>\<exe-name><hash values>\<version>\user.config

Men filene ser ikke ut til å inneholde noe spesielt. Merkelige greier.

Lenke til kommentar

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...