Textdatei auslesen, Formatieren und als Array speichern -weiter gehts ...

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von dasSofa.

    Textdatei auslesen, Formatieren und als Array speichern -weiter gehts ...

    Hallo,

    ich habe eine Textdatei in der Datum, Uhrzeit sowie Temperaturwerte meiner Wetterstation stehen.

    VB.NET-Quellcode

    1. 2010.04.10;11:55:00;15.0
    2. 2010.04.10;11:56:00;16.0
    3. 2010.04.10;11:57:00;17.0
    4. 2010.04.10;11:58:00;18.0
    5. 2010.04.10;11:59:00;19.0
    6. 2010.04.10;12:00:00;20.0


    Diese würde ich gerne Auslesen und das Datum, Uhrzeit und Tempwert als Array ausgeben. Dazu muss ich das Datum und die Uhrzeit auch noch Umwandeln um mit ZedGraph einen Graphen Zeichnen.

    Mein Problem dabei ist es, dass Datum aus der Log "2010.04.10" sowieso die Uhrzeit für XDate in der For Schleife zu Wandeln.

    VB.NET-Quellcode

    1. X = New XDate(date_year(i), date_month(i), date_day(i), date_hour(i), date_min(i), date_sec(i)).XLDate


    Bis jetzt habe ich mit

    VB.NET-Quellcode

    1. Dim Templogreader As String() = IO.File.ReadAllLines("testfile.log")
    2. For i As Integer = 0 To Templogreader.Length - 1

    die Datei gelesen, aber beim Umwandeln scheitere ich kläglich :(
    Wäre für jede Hilfe sehr dankbar !

    Gruß BErnhard

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „dasSofa“ ()

    Ich habe schon viel getestet, bin aber immer an Fehlermeldungen gescheitert.

    z.b.

    VB.NET-Quellcode

    1. Dim Templogreader As String() = IO.File.ReadAllLines("testfile.log")
    2. For i As Integer = 0 To Templogreader.Length - 1
    3. temp_date_Year = Val(Split(Templogreader(i), ".")(0))
    4. x = New XDate(temp_date_Year(i), temp_date_Month(i), temp_date_Day(i), temp_date_Hour(i), temp_date_Minute(i), temp_date_Second(i)).XLDate


    Sagt mir beim Splitten
    Fehler 1 Der Wert vom Typ "Double" kann nicht in "1-dimensionales Array von Integer" konvertiert werden. C:\Users\Bernhard\Documents\Visual Studio 2008\Projects\ZedGraphSampleVB_v5.0.6\ZedGraphSample\Form1.vb 46 30 ZedGraphSample

    Bin noch blutiger Anfänger und verstehe das Problem nicht.

    Oder mit CInt

    VB.NET-Quellcode

    1. temp_date_Year = CInt(Split(Templogreader(i), ".")(0))


    Fehler 1 Der Wert vom Typ "Integer" kann nicht in "1-dimensionales Array von Integer" konvertiert werden. C:\Users\Bernhard\Documents\Visual Studio 2008\Projects\ZedGraphSampleVB_v5.0.6\ZedGraphSample\Form1.vb 46 30 ZedGraphSample

    Es fehlt wohl nocht an Grundlagenkentnissen. Aber nach 2 Tagen habe ich mich entschlossen mal um Hilfe zu Fragen.
    Ein Freund der Java Programmiert hat es auch schon versucht und ist gescheitert.

    Gruß Bernhard

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dasSofa“ ()

    Wenn du die Datentypen nicht mitpostest, kann man eigentlich nur raten :D
    was sind val und temp_date_Year für Datentypen??

    Die Fehlermeldung sagt, daß du einen Double auf ein 1-dimensionales Array zuweisen willst, also passen da 2 Typen nicht zusammen.

    Versuche

    Quellcode

    1. dim temp_date_Year AS string
    2. dim values() as string
    3. values = Templogreader(i).Split(".",StringSplitOptions.None)
    4. temp_date_Year = values(0)

    VB.NET-Quellcode

    1. Dim temp_date_Year, temp_date_Month, temp_date_Day, temp_date_Hour, temp_date_Minute, temp_date_Second As Integer


    Soweit ich weiss kann XDate keine String Werte verarbeiten.

    Wenn ich nun deinen Code einfüge und temp_date_Years als String ,bekomme ich die Fehlermeldung bei

    VB.NET-Quellcode

    1. values = Templogreader(i).Split(".", StringSplitOptions.None)
    2. und
    3. x = New XDate(temp_date_Year(i), temp_date_Month(i), temp_date_Day(i), temp_date_Hour(i), temp_date_Minute(i), temp_date_Second(i)).XLDate


    Fehler 1 Fehler bei der Überladungsauflösung, da keine zugreifbare "Split" ohne einschränkende Konvertierung aufgerufen werden kann:
    'Public Function Split(separator() As Char, options As System.StringSplitOptions) As String()': Der mit dem Argument übereinstimmende Parameter "separator" wird von "String" auf "1-dimensionales Array von Char" reduziert.
    'Public Function Split(separator() As Char, count As Integer) As String()': Der mit dem Argument übereinstimmende Parameter "separator" wird von "String" auf "1-dimensionales Array von Char" reduziert. C:\Users\Bernhard\Documents\Visual Studio 2008\Projects\ZedGraphSampleVB_v5.0.6\ZedGraphSample\Form1.vb 49 22 ZedGraphSample

    Du meinst so oder ?

    VB.NET-Quellcode

    1. Dim temp_date_Year, temp_date_Month, temp_date_Day, temp_date_Hour, temp_date_Minute, temp_date_Second As Integer
    2. Dim Templogreader As String() = IO.File.ReadAllLines("testfile.log")
    3. For i As Integer = 0 To Templogreader.Length - 1
    4. Dim values() As String
    5. values = Templogreader(i).Split(".")
    6. temp_date_Year = values(0)
    7. x = New XDate(temp_date_Year, temp_date_Month, temp_date_Day, temp_date_Hour, temp_date_Minute, temp_date_Second).XLDate


    wenn ja geht es so leider nicht.
    Ich Blick langsam immer weniger durch ...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „dasSofa“ ()

    Ich habe es nun hinbekommen das Datum bei XDate im richtigen Format zu bekommen !

    VB.NET-Quellcode

    1. Dim temp_date_Year, temp_date_Month, temp_date_Day, temp_date_Hour, temp_date_Minute, temp_date_Second As Integer
    2. Dim Templogreader As String() = IO.File.ReadAllLines("testfile.log")
    3. For i As Integer = 0 To Templogreader.Length - 1
    4. Dim TempDatum() As String
    5. Dim TempZeit() As String
    6. TempDatum = Templogreader(i).Split(";")
    7. TempDatum = TempDatum(0).Split(".")
    8. temp_date_Year = TempDatum(0)
    9. temp_date_Month = TempDatum(1)
    10. temp_date_Day = TempDatum(2)
    11. TempZeit = Templogreader(i).Split(";")
    12. TempZeit = TempZeit(1).Split(":")
    13. temp_date_Hour = TempZeit(0)
    14. temp_date_Minute = TempZeit(1)
    15. temp_date_Second = TempZeit(2)
    16. X = New XDate(temp_date_Year, temp_date_Month, temp_date_Day, temp_date_Hour, temp_date_Minute, temp_date_Second).XLDate
    17. y1 = -12
    18. y2 = 25
    19. y3 = i + 12
    20. list1.Add(x, y1)
    21. list2.Add(x, y2)
    22. list3.Add(x, y3)
    23. Next i


    Leider passt nun das Zeilenweise auslesen der Datum und Uhrzeit nicht, hat dazu jemand eine Idee ?
    Bilder
    • Graph.jpg

      29,54 kB, 499×363, 193 mal angesehen

    VB.NET-Quellcode

    1. ' Call this method from the Form_Load method, passing your ZedGraphControl
    2. Sub CreateGraph(ByVal zgc As ZedGraphControl)
    3. Dim myPane As GraphPane = zgc.GraphPane
    4. 'Zeige Point Values beim Start
    5. zgc.IsShowPointValues = True
    6. 'Horizontale Scrollbar + Aktivierung
    7. zgc.IsShowHScrollBar = True
    8. zgc.IsAutoScrollRange = True
    9. ' Beschriftung
    10. myPane.Title.Text = "Min/Max & Temperatur"
    11. myPane.XAxis.Title.Text = "Datum"
    12. myPane.YAxis.Title.Text = "Temp °"
    13. ' Make up some data arrays based on the Sine function
    14. Dim list1 As New PointPairList()
    15. Dim list2 As New PointPairList()
    16. Dim list3 As New PointPairList()
    17. Dim x, y1, y2, y3 As Double
    18. Dim temp_date_Year, temp_date_Month, temp_date_Day, temp_date_Hour, temp_date_Minute, temp_date_Second As Integer
    19. Dim Templogreader As String() = IO.File.ReadAllLines("testfile.log")
    20. For i As Integer = 0 To Templogreader.Length - 1
    21. Dim TempDatum, TempZeit, TempWert As String()
    22. TempDatum = Templogreader(i).Split(";")
    23. TempDatum = TempDatum(0).Split(".")
    24. temp_date_Year = TempDatum(0)
    25. temp_date_Month = TempDatum(1)
    26. temp_date_Day = TempDatum(2)
    27. TempZeit = Templogreader(i).Split(";")
    28. TempZeit = TempZeit(1).Split(":")
    29. temp_date_Hour = TempZeit(0)
    30. temp_date_Minute = TempZeit(1)
    31. temp_date_Second = TempZeit(2)
    32. TempWert = Templogreader(i).Split(";")
    33. X = New XDate(temp_date_Year, temp_date_Month, temp_date_Day, temp_date_Hour, temp_date_Minute, temp_date_Second).XLDate
    34. y1 = -12
    35. y2 = 25
    36. y3 = TempWert(2)
    37. list1.Add(x, y1)
    38. list2.Add(x, y2)
    39. list3.Add(x, y3)
    40. Next
    41. ' Set the XAxis to date type
    42. myPane.XAxis.Scale.Format = "dd.MMM.yyyy" & Chr(10) & "HH:mm:ss"
    43. myPane.XAxis.Type = AxisType.Date
    44. 'Dim gMinTime, gMaxTime As Double
    45. 'gMinTime = New XDate(2010, 4, 10, 0, 0, 0).XLDate
    46. 'gMaxTime = New XDate(2010, 4, 10, 0, 12, 10).XLDate
    47. 'myPane.XAxis.Scale.Min = gMinTime
    48. 'myPane.XAxis.Scale.Max = gMaxTime
    49. 'Generiert Kurven mit Farben
    50. Dim myCurve As LineItem = myPane.AddCurve("Min", _
    51. list1, Color.Blue, SymbolType.None)
    52. Dim myCurve3 As LineItem = myPane.AddCurve("Temp", _
    53. list3, Color.Green, SymbolType.Circle)
    54. Dim myCurve2 As LineItem = myPane.AddCurve("Max", _
    55. list2, Color.Red, SymbolType.None)
    56. myCurve3.Line.IsSmooth = True
    57. 'myCurve3.Line.SmoothTension = 0.5F
    58. ' Farbe des Titels
    59. myPane.Title.FontSpec.FontColor = Color.Black
    60. ' Raster auf dem Graph mit grauer Farbe
    61. myPane.XAxis.MajorGrid.IsVisible = True
    62. myPane.YAxis.MajorGrid.IsVisible = True
    63. myPane.XAxis.MajorGrid.Color = Color.LightGray
    64. myPane.YAxis.MajorGrid.Color = Color.LightGray
    65. ' Position der Legende
    66. myPane.Legend.Position = ZedGraph.LegendPos.Bottom
    67. ' Dicke der Kurven
    68. myCurve.Line.Width = 1.0F
    69. myCurve2.Line.Width = 1.0F
    70. myCurve3.Line.Width = 1.0F
    71. ' Farbfüllung unterhalb der Kurven
    72. myCurve.Line.Fill = New Fill(Color.White, Color.Blue, 45.0F)
    73. myCurve2.Line.Fill = New Fill(Color.White, Color.Red, 45.0F)
    74. myCurve3.Line.Fill = New Fill(Color.White, Color.Green, 45.0F)
    75. ' Increase the symbol sizes, and fill them with solid white
    76. myCurve3.Symbol.Size = 7.0F
    77. myCurve3.Symbol.Fill = New Fill(Color.White)
    78. ' Add a background gradient fill to the axis frame
    79. myPane.Chart.Fill = New Fill(Color.White, _
    80. Color.FromArgb(255, 255, 210), -45.0F)
    81. ' Calculate the Axis Scale Ranges
    82. zgc.AxisChange()
    83. End Sub


    Nun wird der Graph richtig dargestellt !

    Nun geht es dran den TempWert auszulesen, wie bekomme ich nun den Wert y3 As Double ? Bei dem jetzigen Code wir aus "12.5" leider "125.0" gemacht.
    Ich habe es mit dem Convert.ToDouble(TempWert(2)) getestet wobei mir VB sagt das es wegen dem 1-dimmensionalen Array nicht geht.
    Irgend welche Anregungen ?

    Gruß Bernhard

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dasSofa“ ()

    genau das problem hatte ich auch, wobei der_Kurt mich dann darauf aufmerksam gemacht hat, dass es 12,5 heißen muss um es richtig zu konvertieren.

    mach einfach mal statt

    VB.NET-Quellcode

    1. y3 = TempWert(2)


    das hier

    VB.NET-Quellcode

    1. y3 = Double.Parse(TempWert(2).Replace(".", ","))
    leider ist das mit dem . und , ein problem, da es nun auf einem Englischen oder Amerikanischen System nichtmehr funktionieren würde, da bei denen ja 100.000 bei uns 100 entspricht...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Super !
    Da das Programm nur bei mir läuft, ist das mit dem Englischen System egal ;)
    Habe es auch so gemacht nur mit etwas längeren Code. Also danke für die kurze Variante !
    Danke auch an alle Helfer, nun geht alles :thumbsup:

    Gruß Bernhard

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „dasSofa“ ()

    Ich habe nun die Logdatei um 2 Werte ergänzt.

    VB.NET-Quellcode

    1. ' Datum;Uhrzeit;Temperatur;Regenmenge;Regenmenge_Tag
    2. 2010.04.10;11:55:00;15.5;1100;15.0


    Nun kommt etwas ganz kurioses. Wenn ich den TemWert(2) auf TempWert(4) mache, wird im Graphen garnichts angezeigt.
    Beim debuggen ist der TempWert(4) 15.0 als String und y1 15.0 als Double, TempWert(2) ist 15.5 als Stringund y1 15.5 als Double,beim ersten durchlauf von der For i Schleife.
    Wie zum Täufel nochmal kann es sein, das TemWert(4) keinen Graphen Zeichnet ?
    Ich verstehe absolut nicht wieso Zedgraph sich weigert. Es gibt doch keinen Unterschied zwischen TemWert(2) und (4)...

    VB.NET-Quellcode

    1. For i As Integer = 0 To Templogreader.Length - 1
    2. Dim TempDatum, TempZeit, TempWert As String()
    3. TempDatum = Templogreader(i).Split(";")
    4. TempDatum = TempDatum(0).Split(".")
    5. temp_date_Year = TempDatum(0)
    6. temp_date_Month = TempDatum(1)
    7. temp_date_Day = TempDatum(2)
    8. TempZeit = Templogreader(i).Split(";")
    9. TempZeit = TempZeit(1).Split(":")
    10. temp_date_Hour = TempZeit(0)
    11. temp_date_Minute = TempZeit(1)
    12. temp_date_Second = TempZeit(2)
    13. TempWert = Templogreader(i).Split(";")
    14. x = New XDate(temp_date_Year, temp_date_Month, temp_date_Day, temp_date_Hour, temp_date_Minute, temp_date_Second).XLDate
    15. y1 = Double.Parse(TempWert(4).Replace(".", ","))
    16. list1.Add(x, y1)
    17. Next
    Bilder
    • wetterlog.png

      177,06 kB, 1.680×1.050, 172 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „dasSofa“ ()