CSV einlesen und Werte berechnen....kann ich das? ;)

  • Allgemein

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von peterfido.

    CSV einlesen und Werte berechnen....kann ich das? ;)

    Hi,


    ich hab mal eine grundsätzliche Frage und möchte herausfinden ob VB das
    richtige für mich ist, oder ob es andere Programmiersprachen gibt, die
    das besser (einfacher) realisieren können (z.B. C++)....





    Also ich studiere E-technik und hatte 1 Semester VB6 (nur ganz einfache Sachen).


    Ich soll jetzt in meiner Bachelorarbeit Windgeschwindigkeiten auslesen und brechnen.





    Das heisst ich bekomme eine CSV Datei mit sehr vielen Werten
    (Geschwindigkeit und Zeit Werte). Diese muss ich laden und auslesen.


    Ich kann aber nicht jeden Wert aus der Datei brauchen, sondern nur
    jeweils einen Mittelwert (aus 10 minütigem Zeitintervall, es wird jede
    Sek. gemessen).





    Diesen Mittelwert muss das Programm berechnen, in eine Formel eingeben
    und die Leistung daraus berechnen. Die anderen Variablen der Formel sollen
    vorher im Programm eingegeben werden (Fläche, Luftdichte und eine
    Kostante). Daraus berechnet sich dann die Leistung. Diese soll dann
    ausgegeben werden.





    Dann möchte ich noch die berechnete Leistung über die Zeit (auch aus CSV Datei) graphisch darstellen lassen (in Excel?).





    Das ganze für die Geschwindigkeit in 5 verschiedenen Höhen (jeweils eine Spalte in CSV Datei).


    Ausserdem sollen noch die minimalen und maximalen Geschindigkeitswerte ausgelesen und berechnet werden (im 10min Intervall).





    Denkt Ihr dass das machbar ist in VB oder gibts da besseres? Wieviel
    Werte darf so eine CSV Datei enthalten? Muss man dazu sehr tief ins
    Programmieren einsteigen, oder ist das machbar? Hatte auch 1 Jahr C++
    und hab ca 2 Monate Zeit mich einzuarbeiten.

    Wenn VB, welches denkt Ihr ist dann das beste für mich VB6,8,10 oder .NET????




    Würd mich über Eure Meinungen sehr freuen.


    Danke schonmal!





    Gruß Martin...
    Hallo Maig,

    im Prinzip würde ich dir zu dotNet raten, wobei du wie viele andere einen Denkfehler hast.
    VB8 oder VB10 ist nur die Version der IDE, das ist alles VB.NET.

    Zum Einlesen von CSV Dateien hatten wir die Tage schonmal etwas hier.

    Gruss

    mikeb69
    Mach Dir doch folögenden Plan:
    - Ich habe je ca. 60 Datensätze, die gemittelt werden müssen. Die Daten liegen als Datei vor.
    - Ich habe n gemittelte Datensätze, aus denen ich dies und jenes berechnen will.
    - Ich benötige ein mathematisches Modell, das ...
    usw.
    Und zu jedem Anstrich hier kannst Du dann eine präzise Frage stellen, die Dir gerne beantwortetr wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke Euch schonmal.
    Aber ich wollte jetzt noch keine spezielle Frage stellen, sondern nur grundsätzlich wissen ob das machbar ist ohne ein Profi zu sein und welches VB für mich am besten geeignet ist (VB6 oder VB8 etc).
    Oder ob das Grundsachen sind die da von VB verlangt werden, die von einem Laien (aber interessiertem) machbar sind??

    Wenn es dann ans eingemachte geht werden bestsimmt noch genauere Fragen auf euch zu kommen;)

    @mikeb69: Wieso dotNet? Kannst du ein wenig ausführlicher werden?

    Danke, Gruß Martin!
    Hallo Maig,

    nach VB6 gibt es nur noch dotNet(.NET) in den verschiedenen Versionen

    Diese wären (Framework), 1, 1.1, 2, 3.0, 3.5 und als aktuellste Version 4.0

    Das andere sind die Versionen der IDE was schlußendlich mit der Sprache nichts zu tun hat.
    Es ist auch falsch von VB2010 zu sprechen, den es ist nur ein Teil des Visual Studio 2010

    Alle IDE Versionen sind

    2002, 2003, 2005, 2008 und 2010
    Wenn du etwas von VB 8 liesst dann ist die IDE VB2008 (aus dem Visual Studio 2008) gemeint.
    Hiermit kann man Framework 2,3.0 und 3.5 Programme schreiben, was für deinen Anwendungsfall völlig reichen würde.

    Alternativ kannst du als IDE auch SharpDevelop verwenden.

    Und ja - sowas kann ein nicht Profi auch mit wenig Erfahrung programmieren.
    Voraussetzung ist immer eine gesunde Portion selbständiges denken und arbeiten.
    Das müsste ein Student mitbringen.

    Anmerkung:
    Wenn du schon C++ kannst wäre C# evtl. einfacher als VB.NET.
    Die Frameworkgeschichte ist hier die selbe.

    Nachtrag:
    Die hier im Forum verwendeten Kürzel sind natürlich auch falsch und tragen, meiner Meinung nach, zur Verwirrung bei.
    Aus historischen Gründen wird das, hier im Forum, aber so beibehalten.

    Gruss

    mikeb69

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

    Hier bin ich wieder, danke Euch ertmal für Eure Antworten, ich hoffe es kommen noch welche hinzu;)

    So, hab mich jetzt mal die letzten Tage etwas mit meinem "Projekt" beschäftigt.
    Hab viel darüber im Netz gefunden, mal VB6 mal .Net, allerdings nicht immer mit großem Erfolg.
    Im Moment bin ich wieder bei .Net, hab da was aus dem Netz. Hab darüber gelesen dass es wohl ganz gut für meine Zwecke geeignet ist (aus performance Gründen).

    Jetzt möchte ich mal Schritt für Schritt vor gehen. Mal sehen wo das hin führt;)

    Als nächstes wollte ich zwei Sachen in Angriff nehmen.

    1. Wollte ich meine Datei, die ich mittlerweile einlesen kann, über den explorer öffnen. Mit einem Filter für .csv Dateien.

    ich hab das auch schon in VB6 geschafft mit "CommonDialog", aber bei .Net klappt das nicht.

    2. Möchte ich mal ganz einfach aus einer Spalte, aus jeweils drei Werten, den Mittelwert bilden und diese dann alle ausgeben (bei 9 Werten 3 Mittelwerte untereinander ausgeben).

    Hier mal der Code und als Anhang meine kleine Test CSV:

    Imports System.IO
    Imports System.Text.RegularExpressions

    Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim csvFile As String = "e:/9-Z_6-S.csv"

    Dim liste1 As New List(Of String)
    Dim liste2 As New List(Of String)
    Dim liste3 As New List(Of String)
    Dim liste4 As New List(Of String)
    Dim liste5 As New List(Of String)
    Dim liste6 As New List(Of String)

    'RegEx mit 6 Groups und mit Semikolon als Delimiter
    Dim regx As New Regex("(?<1>.*)\s*\;\s*(?<2>.*)\s*\;\s*(?<3>.*)\s*\;\s*(?<4>.*)\s*\;\s*(?<5>.*)\s*\;\s*(?<6>.*)", RegexOptions.Compiled)

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

    Do
    Dim Line As String = Reader.ReadLine
    If Line Is Nothing Then Exit Do
    Dim m As Match = regx.Match(Line)
    If m.Success Then
    liste1.Add(m.Groups("1").Value)
    liste2.Add(m.Groups("2").Value)
    liste3.Add(m.Groups("3").Value)
    liste4.Add(m.Groups("4").Value)
    liste5.Add(m.Groups("5").Value)
    liste6.Add(m.Groups("6").Value)
    End If
    Loop






    End Sub
    End Class





    Danke schonmal und bin auf eure Antworten gespannt....
    Dateien
    • 9-Z_6-S.rar

      (215 Byte, 161 mal heruntergeladen, zuletzt: )
    Ich hab mal Deinen Code etwas modifiziert, nimm ein Feld von Listen, da kannst Du über 2 Indizes voll drauf zugreifen.
    Du solltest noch "Regex()" durch "String.Split()" ersetzen.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim csvFile As String = "C:\Temp\9-Z_6-S.csv"
    3. Dim liste(5) As List(Of String)
    4. Dim i As Integer
    5. For i = 0 To 5
    6. liste(i) = New List(Of String)
    7. Next
    8. 'RegEx mit 6 Groups und mit Semikolon als Delimiter
    9. Dim regx As New Regex("(?<1>.*)\s*\;\s*(?<2>.*)\s*\;\s*(?<3>.*)\s*\;\s*(?<4>.*)\s*\;\s*(?<5>.*)\s*\;\s*(?<6>.*)", RegexOptions.Compiled)
    10. Dim Reader As New StreamReader(csvFile, System.Text.Encoding.Default)
    11. Do
    12. Dim Line As String = Reader.ReadLine
    13. If Line Is Nothing Then Exit Do
    14. Dim m As Match = regx.Match(Line)
    15. If m.Success Then
    16. For i = 0 To 5
    17. liste(i).Add(m.Groups((i + 1).ToString).Value)
    18. Next
    19. End If
    20. Loop
    21. End Sub

    Probier ein wenig, dann sehen wir weiter.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private lst As New List(Of Integer())
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. ' select file
    5. Dim ofd As New OpenFileDialog
    6. ofd.Filter = "CSV Dateien|*.csv"
    7. If ofd.ShowDialog <> DialogResult.OK Then Exit Sub
    8. ' try to open and read
    9. lst.Clear()
    10. For Each s As String In IO.File.ReadLines(ofd.FileName)
    11. lst.Add(StringToIntArray(s))
    12. Next
    13. Debug.Print(lst.Count)
    14. End Sub
    15. Private Function StringToIntArray(ByVal s As String) As Integer()
    16. Dim spl() As String = Split(s, ";")
    17. Dim iarr(spl.Count - 1) As Integer
    18. For i = 0 To spl.Count - 1
    19. If Not Integer.TryParse(spl(i), iarr(i)) Then iarr(i) = -1
    20. Next
    21. Return iarr
    22. End Function
    23. End Class
    Ok, das geht ja schnell....
    Für mich etwas zu schnell;)

    @RodFromGermany: Wie kann ich jetzt am besten darauf zu greiefen? Wieder mit Schleifen?

    @picoflop: So hab ich das gemeint mit dem Explorer, allerdings schaffe ich es nicht mit meinem Programm zu verknüpfen, da fehlt mir dann "Dim csvFile As String =..."

    Naja scheint wohl noch etwas zu dauern bis ich da in Schwung komme:(

    Danke Euch....
    Wenn Du eh Excel zur Darstellung nimmst, kannst Du es auch als Makro und Formular in Excel mit einbinden.

    Ansonsten geht das alles locker mit VB6. Demnach sollte auch bei jüngeren Versionen nichts im Wege stehen. Ich mache mir bei sowas immer Gedanken über den Zielrechner: Ist dort das .NET Framework in der nötigen Version drauf. Darf ich da was installieren?, wenn ja auch mit Admin-Rechten?, was könnte ich nehmen, falls nicht (Mein Excel auf der Arbeit wächst nach und nach zu einer Toolsammlung an), etc
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Am liebsten würde ich es auch in VB6 schreiben, da geht das mit dem Regex aber nicht. Das scheint mir aber recht sinnvoll in meinem Fall?!
    Könnte man denn das "übersetzten" was ich bis jetzt gemacht habe, so dass man es in VB6 kompilieren kann?

    Das ist mein neuester Stand, das mit den Mittelwerten hab ich noch nicht geschfft....

    Quellcode

    1. Imports System.IO
    2. Imports System.Text.RegularExpressions
    3. Public Class Form1
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. ' select file
    6. Dim ofd As New OpenFileDialog
    7. ofd.Filter = "csv Dateien (*.csv)|*.csv|Alle Dateien (*.*)|*.*"
    8. If ofd.ShowDialog <> DialogResult.OK Then Exit Sub
    9. Dim csvFile As String = ofd.FileName
    10. Dim liste(5) As List(Of String)
    11. Dim i As Integer
    12. For i = 0 To 5
    13. liste(i) = New List(Of String)
    14. Next
    15. 'RegEx mit 6 Groups und mit Semikolon als Delimiter
    16. Dim regx As New Regex("(?<1>.*)\s*\;\s*(?<2>.*)\s*\;\s*(?<3>.*)\s*\;\s*(?<4>.*)\s*\;\s*(?<5>.*)\s*\;\s*(?<6>.*)", RegexOptions.Compiled)
    17. Dim Reader As New StreamReader(csvFile, System.Text.Encoding.Default)
    18. Do
    19. Dim Line As String = Reader.ReadLine
    20. If Line Is Nothing Then Exit Do
    21. Dim m As Match = regx.Match(Line)
    22. If m.Success Then
    23. For i = 0 To 5
    24. liste(i).Add(m.Groups((i + 1).ToString).Value)
    25. Next
    26. End If
    27. Loop
    28. 'zum Test:
    29. For Each item As String In liste(4)
    30. MsgBox(item)
    31. Next
    32. End Sub
    33. End Class
    Weiter oben steht was von 5 Höhen. Etwas später wird von 6 Werten pro Zeile gesprochen.
    Sehe ich das richtig, dass immer der erste Wert pro Zeile zu einer Anlage gehört, aus immer 600 Werten (10 Minuten) Min, Max, und Mittelwert erzeugt werden sollen und dann geht es weiter mit dem nächsten Wert der Zeile? Wieviele Zeilen sind insgesamt in einer Datei?
    Gruß
    Peterfido

    Keine Unterstützung per PN!

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

    Leider hab ich die richtige File noch nicht.
    Es geht darum dass die Windgeschwindigkeit in 5 Höhen gemessen wird.
    Es wird alle 5 Sek ein Wert aufgezeichnet.
    Auserdem wird noch die Temperatur gemessen.
    Ich soll jetzt alle 10 min ein Mittelwert bilden, min und max Werte auslesen.
    Die Mittelwerte sollen dann in eine Formel (P=05*Luftdichte(temp.abhängig)*Rotorfläche*Geschwindigkeit*masch.konst) eingesetzt werden (für 5 Höhen) und das Ergebnis dargestellt werden.
    Später soll das ganze evtl noch Graphisch dargestellt werden, evt auch die Windgeschw in abhängikeit von der Höhe.

    Im Anhang mal eine File, so denke ich wird das Originale dann aussehen.
    Von der Länge her wird es wohl auf ein Jahr kommen....
    Gruß Martin
    Dateien
    • Daten.rar

      (1,7 kB, 134 mal heruntergeladen, zuletzt: )
    Das wären bei einem Jahr dann 6311520 Zeilen...
    Alle 10 Minuten wären das dann noch 52560 - 52704 Zeilen.
    Ein Listview schafft 32768.
    Also schon während des Einlesens die Min-Max-Mittelwerte berechnen und dann z.B. monatlich, max. halbjährlich auf Listviews aufteilen.

    Das Einlesen ist eine Kleinigkeit. Durch die Datenmenge dauert es dann aber schon ein Weilchen. Also am besten die berechneten Werte gleich wieder abspeichern fürs Archiv.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    abspeichern nur, wenn man sie denn braucht, sofern man nur Mittelwert Min und Max braucht, kann man diese in Variablen zwischenspeichern(für den Mittelwert, wohl alle Werte zusammen addiert), dann muss man das ganze nur entsprechend bei jeder neuen Zeile anpassen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hier mal bissel Starthilfe:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Explicit
    2. Private Type WDWerte 'Hilfstyp zum 10 Minuten Datensätze zwischenspeichern
    3. Datum As String
    4. Uhrzeit As String
    5. Min(5) As Double 'Jeweils 6 Messwerte pro Zeile
    6. Max(5) As Double
    7. Summe(5) As Double
    8. End Type
    9. Private Sub cmdOeffnen_Click()
    10. Dim f As Integer
    11. Dim sText As String
    12. Dim sWerte() As String 'Array für Aufpsaltung der Zeilen in mehrere Werte
    13. Dim i As Integer
    14. Dim ii As Integer
    15. Dim Anzahl As Integer
    16. Dim oItemx As Object 'Hilfsvariable für Datenanhang an Listview
    17. Dim WWerte As WDWerte
    18. For i = 0 To 5
    19. WWerte.Min(i) = 2147483647 'Alle Minwerte auf utopisch hohe Zahl einstellen
    20. Next i
    21. With CD1 'CommonDialogControl
    22. .CancelError = False 'Fehlermeldung bei Abbrechen ausschalten
    23. .Filter = "csv Dateien (*.csv)|*.csv|Alle Dateien (*.*)|*.*" 'Filter für Dateierweiterungen
    24. .DialogTitle = "Bitte die Datei auswählen"
    25. .ShowOpen
    26. If .FileName <> "" Then 'Dateiname übergeben?
    27. f = FreeFile
    28. Open .FileName For Input As #f 'Datei zum lesen öffnen
    29. Line Input #f, sText 'erste Zeile einlesen
    30. If InStr(1, sText, ";", vbTextCompare) > 0 Then 'Auf Trennzeichen ; prüfen
    31. sWerte = Split(sText, ";", -1, vbTextCompare)
    32. For i = 0 To 1 'Für beide Listviews die Überschriften setzen
    33. With lvWerte(i) 'ListViews View auf Report stellen
    34. .ColumnHeaders.Clear
    35. .ColumnHeaders.Add , , "Datum", 900 '1. Spalte. Alle Spalten pauschal 900 Einheiten breit.
    36. .ColumnHeaders.Add , , "Uhrzeit", 900
    37. If UBound(sWerte) > 2 Then ' Mehr als 3 Werte in der Zeile?
    38. For ii = 2 To UBound(sWerte) 'Messwerte erwartet ab der 3. Spalte. Jeder Messwert bekommt Min, Mittel und Max
    39. .ColumnHeaders.Add , , sWerte(ii) & " -", 900
    40. .ColumnHeaders.Add , , sWerte(ii) & " ~", 900
    41. .ColumnHeaders.Add , , sWerte(ii) & " +", 900
    42. Next ii
    43. End If
    44. End With
    45. Next i
    46. End If
    47. Do Until EOF(f) 'Bis Dateiende
    48. Line Input #f, sText 'Zeilenweise einlesen
    49. If InStr(1, sText, ";", vbTextCompare) > 0 Then 'Wieder die Trennzeichen Geschichte
    50. sWerte = Split(sText, ";", -1, vbTextCompare)
    51. If UBound(sWerte) = 7 Then 'Sieben Spalten gefunden?
    52. Anzahl = Anzahl + 1 'Zähler erhöhen
    53. For i = 2 To 7
    54. If Anzahl = 61 Then ' 61. Messwert besser geeignet für Durchschnittsuhrzeit
    55. WWerte.Datum = sWerte(0)
    56. WWerte.Uhrzeit = Format(sWerte(1), "HH:MM:00") 'Uhrzeit auf 0 Sekunden bringen, deswegen der 61. Wert
    57. End If
    58. WWerte.Summe(i - 2) = WWerte.Summe(i - 2) + CDbl(sWerte(i)) 'Messwerte in Hilfstyp für Durschnitt addieren
    59. If CDbl(sWerte(i)) > WWerte.Max(i - 2) Then 'prüfen auf Maxwert
    60. WWerte.Max(i - 2) = CDbl(sWerte(i)) 'Evtl. Maxwert speichern
    61. End If
    62. If CDbl(sWerte(i)) < WWerte.Min(i - 2) Then 'prüfen auf Minwert
    63. WWerte.Min(i - 2) = CDbl(sWerte(i)) 'Evtl. Minwert speichern
    64. End If
    65. Next i
    66. End If
    67. If Anzahl = 120 Then '120 Datensätze = 10 Minuten alle 5 Sekunden
    68. Anzahl = 0 'Zähler für nächsten 10 Minuten zurücksetzen
    69. If Month(CDate(WWerte.Datum)) > 6 Then 'Monat Juli-Dezember=
    70. ii = 1 'Ziel = Listview 2
    71. Else
    72. ii = 0 'Ziel = Listview 1
    73. End If
    74. Set oItemx = lvWerte(ii).ListItems.Add(, , WWerte.Datum) 'Neue Zeile ins Listview. Erste Wert wird hier übergeben
    75. oItemx.SubItems(1) = WWerte.Uhrzeit ' Nächste Wert kommt hier rein
    76. ii = 2 'ab 3. Spalte kommen die Messwerte mit Min Mittel Max
    77. For i = 0 To 5 '6 Messwerte pro Zeile
    78. oItemx.SubItems(ii) = WWerte.Min(i) 'Min auslesen und in Listview eintragen
    79. WWerte.Min(i) = 2147483647 'Min hochdrehen, falls der nächste Datensatz das aktuelle Min nicht unterschreiten kann
    80. ii = ii + 1 'Nächste Spalte im Listview
    81. oItemx.SubItems(ii) = WWerte.Summe(i) / 120 'Durchschnitt ausrechnen und eintragen
    82. WWerte.Summe(i) = 0 'Durchschnitt auf 0
    83. ii = ii + 1 'Wieder eine Spalte weiter
    84. oItemx.SubItems(ii) = WWerte.Max(i) ' Max in Listview schreiben
    85. WWerte.Max(i) = 0
    86. ii = ii + 1 'Wieder eine Spalte weiter für nächsten Messwert
    87. Next i
    88. End If
    89. End If
    90. Loop ' Bis Dateiende Schleife durchlaufen
    91. Close #f 'Datei schließen
    92. End If
    93. End With
    94. End Sub
    95. Private Sub Label1_Click(Index As Integer) 'Umschalten der 6-Monats Listviews
    96. If Index = 0 Then
    97. lvWerte(1).Visible = False
    98. lvWerte(0).Visible = True
    99. Label1(1).BackColor = vbRed
    100. Label1(0).BackColor = vbGreen
    101. Else
    102. lvWerte(0).Visible = False
    103. lvWerte(1).Visible = True
    104. Label1(0).BackColor = vbRed
    105. Label1(1).BackColor = vbGreen
    106. End If
    107. End Sub
    Bilder
    • sshot-2.png

      108,55 kB, 1.247×724, 301 mal angesehen
    Dateien
    • Beispiel.zip

      (15,49 kB, 198 mal heruntergeladen, zuletzt: )
    Gruß
    Peterfido

    Keine Unterstützung per PN!

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