Avatar billede bondester Nybegynder
06. juni 2004 - 19:24 Der er 23 kommentarer og
1 løsning

Min If virker ikke ordenlig (tror jeg)

Jeg er ved at lave mit første vb.NET konsolprogram og har så fået lidt problemer... Programmet parser noget tekst og retter så i nogle klokkeslet, og det er dem der giver problemer!
De står på formen hh:mm:ss og har så lavet følgende:

    Dim tim, min, sek As Byte

    If strDelLine.Chars(0) = "0" Then
          tim = CByte(Mid(strDelLine, 2, 2))
    Else
          tim = CByte(Mid(strDelLine, 1, 2))
    End If

    If strDelLine.Chars(4) = "0" Then
          min = CByte(Mid(strDelLine, 5, 5))
    Else
          min = CByte(Mid(strDelLine, 4, 5))
    End If

    If strDelLine.Chars(7) = "0" Then
          sek = CByte(Mid(strDelLine, 8, 8))
    Else
          sek = CByte(Mid(strDelLine, 7, 8))
    End If

    strDelLine = "Klokken er: " & tim & ":" & min & ":" & sek & "."
    Console.WriteLine(strDelLine)

Programmet laver fejl, og tror det er fordi min IF ikke er rigtig... Men ved bare ikke hvordan den så skal laves! tim, min og sek skulle meget gerne komme til at indeholde de 3 tidsvariabler!

Nogen der kan hjælpe??
Avatar billede arne_v Ekspert
06. juni 2004 - 19:28 #1
Umiddelbart tror jeg at

If strDelLine.Chars(4) = "0" Then
   
skal være

If strDelLine.Chars(3) = "0" Then

(og næste skal ændres fra 7 til 6)
Avatar billede arne_v Ekspert
06. juni 2004 - 19:28 #2
Mid er iøvrigt en VB6 kompatibel funktion. Den rigtige .NET er Substring
metoden på String.
Avatar billede arne_v Ekspert
06. juni 2004 - 19:29 #3
tim = int.Parse(strDelLine.Substring(0,2))
Avatar billede arne_v Ekspert
06. juni 2004 - 19:31 #4
Iøvrigt kan man lave:

Dim dt As DateTime = DateTime.Parse(strDelLine)

men det er en helt anden historie
Avatar billede guidmaster Nybegynder
06. juni 2004 - 19:33 #5
Er der nogen speciel grund til at du ikke arbejder med DateTime typen? Så kunne din kode se ud som følgende:
Dim tim, min, sek as Integer
Dim moment as DateTime Convert.ToDateTime(strDelLine)
tim = moment.Hour
min = moment.Minute
sek = moment.Second
Avatar billede bondester Nybegynder
06. juni 2004 - 19:46 #6
Hmmm først til arne_v SJOV MÅDE DU SVARE PÅ ;-)

Jeg skal bagefter dette trække noget fra tim, min og sek, men det kan jo egentlig godt lade sig gøre med det guidmaster skriver!

Prøver lige at lege med den tanke ;-)
Avatar billede bondester Nybegynder
06. juni 2004 - 19:55 #7
Den kan altså ikke lave den convert....
Hvis jeg laver en Console.WriteLine(strDelLine) udskriver den bla. 01:24:59, men når jeg som guidmaster skriver Covert.ToDateTime(strDelLine) får jeg bare følgende fejl:

An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll

Additional information: The string was not recognized as a valid DateTime.  There is a unknown word starting at index 0.

Og ved arne_v's eksempel DateTime.Parse(strDelLine) får jeg den samme!
Avatar billede bondester Nybegynder
06. juni 2004 - 19:55 #8
Må der ikke være : i den string???
Avatar billede bondester Nybegynder
06. juni 2004 - 19:57 #9
Nej det er ikke det... Har lige forsøgt med en Replace funktion.
Avatar billede arne_v Ekspert
06. juni 2004 - 20:05 #10
Alle 3 måder demonstreret (i en form som virker):

Imports System
Imports Microsoft.VisualBasic

Module Main
    Sub Main()
        Dim tim, min, sek As Byte
        ' original
        Dim strDelLine As String = "12:34:56"
        If strDelLine.Chars(0) = "0" Then
            tim = CByte(Mid(strDelLine, 2, 1))
        Else
            tim = CByte(Mid(strDelLine, 1, 2))
        End If
        If strDelLine.Chars(3) = "0" Then
            min = CByte(Mid(strDelLine, 5, 1))
        Else
            min = CByte(Mid(strDelLine, 4, 2))
        End If
        If strDelLine.Chars(6) = "0" Then
            sek = CByte(Mid(strDelLine, 8, 1))
        Else
            sek = CByte(Mid(strDelLine, 7, 2))
        End If
        Console.WriteLine(tim & " " & min & " " & sek)
        ' dot netsk
        If strDelLine.Chars(0) = "0" Then
            tim = Byte.Parse(strDelLine.Substring(1, 1))
        Else
            tim = Byte.Parse(strDelLine.Substring(0, 2))
        End If
        If strDelLine.Chars(3) = "0" Then
            min = Byte.Parse(strDelLine.Substring(4, 1))
        Else
            min = Byte.Parse(strDelLine.Substring(3, 2))
        End If
        If strDelLine.Chars(6) = "0" Then
            sek = Byte.Parse(strDelLine.Substring(7, 1))
        Else
            sek = Byte.Parse(strDelLine.Substring(6, 2))
        End If
        Console.WriteLine(tim & " " & min & " " & sek)
        ' den smarte måde
        Dim dt As DateTime = DateTime.Parse(strDelLine)
        tim = dt.Hour
        min = dt.Minute
        sek = dt.Second
        Console.WriteLine(tim & " " & min & " " & sek)
    End Sub
End Module
Avatar billede bondester Nybegynder
07. juni 2004 - 13:45 #11
Hmmm det er lidt underligt, hvis jeg siger strDelLine = "12:34:56" så virker det fint, men med de strDelLine kommer jo fra en længere tekst som jeg parser... Jeg har prøvet at skrive Console.WriteLine("'" & strDelLine & "'") og det ser altså rigtigt ud, der er ingen mellemrum eller noget... Kun klokkeslettet!

Jeg prøver lige at smide hele koden, gider du så kigge på det:


Module Module1

    Sub Main()
        ' Hent antal sekunder
        Console.WriteLine("Indtast det antal sekunder der skal lægges til eller trækkes fra!")
        Console.WriteLine("Husk at anføre + eller minus.")
        Dim Sekunder As Integer = CInt(Console.ReadLine())

        ' Find alle sub-filer i applikationsmappen og kald RedigerSekunder
        Dim Fil As String, FilNavn As String, Filer() As String
        Filer = System.IO.Directory.GetFiles(System.IO.Directory.GetCurrentDirectory, "*.sub")
        For Each Fil In Filer
            RedigerSekunder(Fil, Sekunder)
        Next

        Console.WriteLine("Applikation afluttet.... Tryk ENTER!")
        Console.ReadLine()
    End Sub

    Private Sub RedigerSekunder(ByVal Fil As String, ByVal Sekunder As Integer)
        Dim objStreamReader As System.IO.StreamReader
        Dim objStreamWriter As System.IO.StreamWriter

        Dim strLine, strDelLine As String
        Dim tim, min, sek As Byte

        'Fortæl placering af filen vi vil åbne
        objStreamReader = New System.IO.StreamReader(Fil)
        'Fortæl placeringen af filen vi vil lave... Altid C:\CowmansSudEditor.sub
        objStreamWriter = New System.IO.StreamWriter("C:\CowmansSudEditor.sub")

        'Read the first line of text.
        strLine = objStreamReader.ReadLine

        'Fortsæt indtil strLine bliver tom = filen er slut.
        Do While Not strLine Is Nothing

            If InStr(strLine, "[") = 1 Then
                If InStr(strLine, "]") = 10 Then
                    strDelLine = Mid(strLine, 2, 8)
                    strDelLine = Replace(strDelLine, ":", "")

                    Console.WriteLine("'" & strDelLine & "'")

                    Dim moment As DateTime = DateTime.Parse(strDelLine)

                    tim = moment.Hour
                    min = moment.Minute
                    sek = moment.Second

                    strDelLine = "Denne er spec: [" & tim & ":" & min & ":" & sek & "]"
                Else
                    strDelLine = strLine
                End If
            Else
                strDelLine = strLine
            End If

            Console.WriteLine(strDelLine)

            'Skriv linien til ny fil
            objStreamWriter.WriteLine(strDelLine)

            'Læs ny linie fra filen
            strLine = objStreamReader.ReadLine
        Loop

        'Luk filerne
        objStreamReader.Close()
        objStreamWriter.Close()
    End Sub

End Module
Avatar billede arne_v Ekspert
07. juni 2004 - 23:24 #12
strDelLine = Replace(strDelLine, ":", "")

fjerner de semikolonner som DateTime.Parse skal bruge

prøv og fjern den

(og hvis det ikke virker, så post en præcis fejl beskrivelse)
Avatar billede bondester Nybegynder
09. juni 2004 - 23:20 #13
Beklager jeg først vender tilbage nu ;-)

Fejlen lyder som følger:
An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll

Additional information: The string was not recognized as a valid DateTime.  There is a unknown word starting at index 0


Den underlige replace funktion var kun fordi jeg forsøgte mig lidt frem...
Den kildekode som jeg bruger ser sådan ud:
Module Module1

    Sub Main()
        ' Hent antal sekunder
        Console.WriteLine("Indtast det antal sekunder der skal lægges til eller trækkes fra!")
        Console.WriteLine("Husk at anføre + eller minus.")
        Dim Sekunder As Integer = CInt(Console.ReadLine())

        ' Find alle sub-filer i applikationsmappen og kald RedigerSekunder
        Dim Fil As String, FilNavn As String, Filer() As String
        Filer = System.IO.Directory.GetFiles(System.IO.Directory.GetCurrentDirectory, "*.sub")
        For Each Fil In Filer
            RedigerSekunder(Fil, Sekunder)
        Next

        Console.WriteLine("Applikation afluttet.... Tryk ENTER!")
        Console.ReadLine()
    End Sub

    Private Sub RedigerSekunder(ByVal Fil As String, ByVal Sekunder As Integer)
        Dim objStreamReader As System.IO.StreamReader
        Dim objStreamWriter As System.IO.StreamWriter

        Dim strLine, strDelLine As String
        Dim tim, min, sek As Byte

        'Fortæl placering af filen vi vil åbne
        objStreamReader = New System.IO.StreamReader(Fil)
        'Fortæl placeringen af filen vi vil lave... Altid C:\CowmansSudEditor.sub
        objStreamWriter = New System.IO.StreamWriter("C:\CowmansSudEditor.sub")

        'Read the first line of text.
        strLine = objStreamReader.ReadLine

        'Fortsæt indtil strLine bliver tom = filen er slut.
        Do While Not strLine Is Nothing

            If InStr(strLine, "[") = 1 Then
                If InStr(strLine, "]") = 10 Then
                    strDelLine = Mid(strLine, 2, 8)

                    Dim moment As DateTime = DateTime.Parse(strDelLine)

                    tim = moment.Hour
                    min = moment.Minute
                    sek = moment.Second

                    strDelLine = "Denne er spec: [" & tim & ":" & min & ":" & sek & "]"
                Else
                    strDelLine = strLine
                End If
            Else
                strDelLine = strLine
            End If

            Console.WriteLine(strDelLine)

            'Skriv linien til ny fil
            objStreamWriter.WriteLine(strDelLine)

            'Læs ny linie fra filen
            strLine = objStreamReader.ReadLine
        Loop

        'Luk filerne
        objStreamReader.Close()
        objStreamWriter.Close()
    End Sub

End Module

Jeg forstår det simpelthen ikke... Det er altså af det rigtige format!
Avatar billede arne_v Ekspert
09. juni 2004 - 23:25 #14
Prøv lige og udskriv strDelLine lige inden Parse kaldet
Avatar billede bondester Nybegynder
11. juni 2004 - 18:50 #15
Det giver det rigtige format.... Har prøvet at sætte ' omkring og det gav '12:34:56' så det er ikke det der er galt...
Avatar billede arne_v Ekspert
11. juni 2004 - 19:01 #16
Kan du prøve at erstatte

DateTime.Parse(strDelLine)

med

DateTime.Parse(strDelLine, new CultureInfo("da-DK", false));
Avatar billede bondester Nybegynder
12. juni 2004 - 22:01 #17
Jeg får at vide at CultureInfo ikke er defineret.... Har det noget at sige??
Avatar billede arne_v Ekspert
13. juni 2004 - 18:14 #18
Imports System.Globalization
Avatar billede bondester Nybegynder
14. juni 2004 - 12:58 #19
Har prøvet det du skrev men får stadig den samme fejl!

Er det muligt at jeg kan maile dig en af de filer der skal parses, så du selv kan se fejlen, og måske bedre hjælpe mig med at rette den??
Avatar billede arne_v Ekspert
14. juni 2004 - 13:00 #20
Ja

arne_v@mail.danbbs.dk
Avatar billede bondester Nybegynder
14. juni 2004 - 13:03 #21
Avatar billede arne_v Ekspert
15. juni 2004 - 09:15 #22
[FILEPATH]

og

[00:02:21]

har [ og ] i samme positionber => den forsøger art parse FILEPATH som en tid =>
fejl
Avatar billede arne_v Ekspert
15. juni 2004 - 09:16 #23
Når [FILEPATH] og [CD TRACK] fjernes så kører programmet.
Avatar billede bondester Nybegynder
15. juni 2004 - 11:46 #24
Jeg takker mange gange.. Hader når man ser sig blind på noget!
Jeg har lige fordoblet points nu jeg har været så dum ;-)

Jeg finder lige en måde hvor [FILEPATH] og [CD TRACK] bliver spunget over, og så kører programmet vist!

Takker for handlen!
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