CSV Datei auslesen nach Datum und Uhr Zeit ab 2. Zeile

  • VB.NET

Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von Kasi.

    Hallo Vaporized,

    ich habe dein Code verwendet, es funktioniert nicht.

    VB.NET-Quellcode

    1. Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
    2. If CheckBox1.CheckState = 1 Then
    3. Me.ComboBox1.Items.Clear()
    4. ComboBox1.Enabled = True
    5. Dim agentlistpath As String = "C:\DATA\test1111.csv"
    6. If File.Exists(agentlistpath) Then
    7. Using sr As New StreamReader(agentlistpath)
    8. While Not sr.EndOfStream
    9. Dim lineText As String() = sr.ReadLine().Split(";"c)
    10. 'ComboBox1.DataSource = lineText.Select(x >= x.Name).Distinct().ToList()
    11. 'ComboBox1.Items.Add(lineText.FirstOrDefault) ' liste ist da aber mit doppelte Namen
    12. ComboBox1.AddRange(lineText.Distinct.ToArray)' es funktioniert nicht
    13. 'ComboBox1.Items.Add(String.Format("{1}{0}", _
    14. ' Environment.NewLine, _
    15. ' lineText(0)))
    16. End While
    17. End Using
    18. Else
    19. End If
    20. Else
    21. If CheckBox2.CheckState = 0 Then
    22. Me.ComboBox1.Items.Clear()
    23. Me.ComboBox1.Text = ""
    24. ComboBox1.Enabled = False
    25. End If
    26. End If
    end sub

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

    Toni_Edi schrieb:

    es funktioniert nicht.
    Spitzenmäßige Fehlerbeschreibung.
    Schon mal mit Debuggen versucht?
    Debuggen, Fehler finden und beseitigen
    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!

    Toni_Edi schrieb:

    ich habe dein Code verwendet
    Nö, an keiner Stelle.

    VaporiZed schrieb:

    IO.File.ReadAllLines statt des StreamReaders
    Steht nirgends.

    VaporiZed schrieb:

    List(Of String)
    verwendest Du gar nicht.

    VaporiZed schrieb:

    die Einträge dieser List per Distinct
    Du verwendest Distinct anders, als ich beschrieben habe. Würde ich meinen Beschriebung folgen, würde ich bei dem, hier ankommen:

    VB.NET-Quellcode

    1. Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    2. If CheckBox1.CheckState <> 1 Then Return
    3. Me.ComboBox1.Items.Clear()
    4. ComboBox1.Enabled = True
    5. Dim PathOfAgentList = "C:\DATA\test1111.csv"
    6. If Not IO.File.Exists(PathOfAgentList) Then Return
    7. Dim FileLines = IO.File.ReadAllLines(PathOfAgentList, System.Text.Encoding.Default)
    8. Dim DataList As New List(Of String)
    9. For Each FileLine In FileLines
    10. Dim FirstLinePart = FileLine.Split(";"c).FirstOrDefault
    11. If String.IsNullOrEmpty(FirstLinePart) Then Continue For
    12. DataList.Add(FirstLinePart)
    13. Next
    14. ComboBox1.Items.AddRange(DataList.Distinct.ToArray)
    15. End Sub

    Und das geht ziemlich sicher (auch wenn mir gerade Zeit und Muße fehlen, das zu prüfen (shame, ich weiß)). Normalerweise würde ich es mit LINQ und eigenen Extensions noch schöner machen, aber das ist ein anderes Thema.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hallo Vaporized,
    ich habe so nicht vorgestellt und gedacht, dass man soviel ändern muss.

    Das hat geklappt , Yuhoooooooo superrrrrrrrrrrrrrrr.

    Amazing!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


    Es hat funktioniert, in Combobox wird die erste column angezeigt.
    Das ist was ich gesucht habe.

    Zuerst habe ich gedacht wo bin gelandet, aber langsam ich komme klar.
    Hier bin ich gut geholfen.



    Ich habe hierzu eine Frage, falls wenn ich nur zweite oder 3 Column in Combobox auslesen will, wie kann ich weiter modifizieren.
    Kannst du bitte auch zeigen.

    vielen Dank
    Hi Toni,

    in Post#15 habe ich dir doch ein Link gegeben, solltest du auch Lesen

    hier ein Bsp. mit dem du die "Spalte" in deiner CSV auslesen/auswählen kannst

    VB.NET-Quellcode

    1. Private Toni_EdiList As New List(Of String)
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Dim yourFile = IO.File.ReadAllLines("D:\Toni.csv").Skip(1)
    4. Toni_EdiList =
    5. (
    6. From line In yourFile
    7. Where line.Length > 0 Let Items = line.Split(";"c) _
    8. Select yourItem = Items(0)
    9. Distinct
    10. Order By yourItem
    11. ).ToList
    12. 'deine CSV:
    13. 'Name;Date;Time;OK;Eb;Ebe1_x;Eb1_y;Eb_°;Eb_g;Eb_x;Eb_y;Eb_°;st_g;st_x;st_y;st_°;
    14. 'aal;25.10.2017;08:31:26;False;3,7;-30;36;162,7;17,8;2;8;220,5;20;-22;38;211,4;;;
    15. 'Auswahl über Items
    16. 'Items(0) = Name
    17. 'Items(1) = Date
    18. 'Items(2) = Time
    19. 'etc...
    20. ComboBox1.DataSource = Toni_EdiList
    21. End Sub


    wobei du 2 Spalten hast = Date;Time
    das sollte meiner Meinung nach eine Spalte sein

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


    Hallo Kasi,

    es gibt so viele Wege, dein Code hat funktioniert.
    Man lernt immer dazu.
    Super!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    vielen Dank Kasi

    ------------------------------------------------------------------------------------------------------------------------
    Jetzt komme ich auf ursprünglicher Frage,

    ich brauche von euch nur noch 2 Sachen.
    1) ich möchte die Daten nach Datum und Uhrzeit auslesen (von - bis).
    2) wenn Checkbox aktive ist dann lese nach Datum, Uhrzeit und nach Text.
    Text
    aus Combobox
    Alles in DataGridView1.DataSource=thereader

    Der Text ist in Column (0)
    Das Datum ist in Column (1)
    Uhrzeit ist in Column (2)

    Aktuelle Code siehe Post#10 von ErfinderDesRades

    Ich wollte auch Sreenshot von meine WORK schicken, leider weiss ich nicht wie.

    Bitte kann jemand mir helfen?
    Bisjetzt habt ihr gut geholfen.



    vielen Dank,

    Hallo Erfiderdesrades,

    Einmal lesen ich komplette Text Datei in Datagrid und von Vaporized, Kasi lese die Namen Column(0) in Combobox.
    Das sind zwei verschiedene Aufgaben.

    Meine Aufgabe habe ich in Post# 26 geschrieben.

    Manchmal hilft Ihr alle, manchmal gar keine :( i don't know why?

    Kann jemand mir helfen?

    1) Inhalte nach Datum und Uhrzeit (von-bis) ganze Reihe lesen // mit OK Button
    2) Nach Datum, Uhrzeit und auch nach Text lesen >>> Text ist in Combobox // mit selben OK Button und die abfrage If CheckBox1.CheckState = 1 Then Combobox.Text

    Meine CSV-Datei:

    Name;Date;Time;OK;Eb;Ebe1_x;Eb1_y;Eb_°;Eb_g;Eb_x;Eb_y;Eb_°;st_g;st_x;st_y;st_°; ' Erste Reihe Headreader, nicht lesen

    aal;23.10.2017;08:31:26;False;3,7;-30;36;162,7;17,8;2;8;220,5;20;-22;38;211,4;;; ' ab hier fängt die die Daten // Column (0) ist Cmbo.text
    aal;24.10.2017;08:32:45;False;3,1;39;-131;29,3;50,1;2;-5;16,8;53,1;17;-56;17,5;;;
    AB;25.10.2017;08:36:52;False;3,1;39;-131;29,3;50,1;2;-5;16,8;53,1;17;-56;17,5;;;


    Danke,
    Wenn Du Deine Anforderungen noch konkret beschreiben könntest, könnte man Dir auch weiterhelfen. Was soll das heißen

    Toni_Edi schrieb:

    Inhalte nach Datum und Uhrzeit (von-bis) ganze Reihe lesen
    Werd mal bitte da mit 1-3 Beispielen konkret.
    Und die 2. Aufgabe versteh ich auch nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Toni_Edi schrieb:

    Einmal lesen ich komplette Text Datei in Datagrid und von Vaporized, Kasi lese die Namen Column(0) in Combobox.
    Das sind zwei verschiedene Aufgaben.
    Du könntest die Daten einmal in ein geeignetes Datenmodell einlesen - und an dieses Datenmodell könntest du sowohl das DGV anbinden als auch die Combobox.
    Ein Einlese-Vorgang - dieselben Daten.
    Die dritte Aufgabe - "Datum und Uhrzeit auslesen (von - bis)" (was immer darunter zu verstehen ist) wäre damit hinfällig.
    Weil die Daten sind ja schon eingelesen ins Datenmodell - das muss man nur noch benutzen.
    Und wenn du einen Auszug der Daten anzeigen willst wäre das eine Filterungs-Aufgabe - nicht denselben Kram schon wieder einlesen.

    guck - in post#1 gibts ja sogar schon ein geeignetes Datenmodell - nämlich theDataTable.
    Also war schon das Einlesen der Daten für die Combobox suboptimal.
    Besser wäre, du würdest die Daten der DataTable durchgehen, und daraus Daten für die Combobox extrahieren (nämlich Column1, Distinct).



    Wie dem auch sei - post#26 verstehe ich überhaupt nicht.
    Frage 1: Was bedeutet: "Daten nach Datum und Uhrzeit auslesen (von - bis)."?
    Willst du ein Datum angeben, und alle Daten, die später sind "auslesen" (was immer das bedeutet)?
    Ja, was bedeutet "auslesen"?
    In meiner Welt tu ich immer was einlesen, nämlich Daten in ein Datenmodell.
    Wo-hinein also willst du aus- oder ein-lesen?



    Glaub sehr hilfreich wäre, wenn du mal erklärst was das alles soll.
    Wo kommt die TextDatei her, warum wird der Kram sowohl in einem DGV als auch in einer Combo angezeigt, und wieso jetzt das ominöse "nach Datum und Uhrzeit auslesen (von - bis)"?

    Also erklär mal, was das für ein Programm wird: CnC-Maschinen ansteuern, Gps-Daten verarbeiten, Blumen verkaufen, Haus-Automation, Genom-Analyse,...
    @ErfinderDesRades
    bist du schlecht gelaunt Heute?

    ist doch offenstsichlich was er will,
    seine vielleicht 30000 zeilen Filtern nachdem was er aus der Combobox wählt
    z.b. den Namen 'aal'
    diese sollen dann zusätzlich aus einem bestimmten Zeitraum sein
    Datum von - bis
    verstehen nicht warum du seinen Beitrag 'zerpflücken' willst
    und warum du immer alles in einem Datenmodell einlesen willst ist mir schleierhaft

    gehen wir wir von 30000 Zeilen in der CSV aus
    davon sind in Spalte 1 lediglich 128 Distinct werte enthalten
    diese werden mit (deine Worte: 'suboptimalen') Lösung von Post#25 ausgelesen

    das Filtern wird anschließend per Button ausgelöst

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. 'deine Filter
    3. 'ändere zu DateTimePicker
    4. Dim fromDate As DateTime = New DateTime(2017, 10, 24, 10, 2, 22)
    5. Dim toDate As DateTime = New DateTime(2017, 10, 26, 12, 27, 45)
    6. Dim xName As String = ComboBox1.Text
    7. 'Query auslösen
    8. Dim results = (From line In File.ReadAllLines("D:\Toni.csv").Skip(1) _
    9. Let fields = line.Split(New Char() {";"c}).AsEnumerable() _
    10. Where DateTime.Parse(fields.ElementAt(1)) > fromDate AndAlso _
    11. DateTime.Parse(fields.ElementAt(1)) < toDate AndAlso _
    12. fields.ElementAt(0) = xName Select fields).ToArray()
    13. 'elemente zurück geben
    14. 'hier in DGV darstellen
    15. 'zum Test an Debug fenster ausgeben
    16. For Each element In results
    17. Debug.WriteLine(element(0) & " : " _
    18. & element(1) & " : " _
    19. & element(2) & " : " _
    20. & element(3) & " : " _
    21. & element(4) & " : " _
    22. & element(5))
    23. Next
    24. End Sub


    der Debug output

    VB.NET-Quellcode

    1. LR : 25.10.2017 : 08:47:13 : False : 3,1 : -95
    2. LR : 26.10.2017 : 08:50:18 : False : 6,5 : 5


    es werden nur die Daten abgefragt die ich auch haben möchte, und nicht erst mal alle Daten Laden,was ich für Suboptimal halte


    @Toni_Edi
    das mit 2 Spalten Datum und Zeit
    solltest du überdenken, wie ich schon sagte diese gehören zusammen

    Kasi schrieb:

    bist du schlecht gelaunt Heute?
    nein - nicht dass ich wüsste.

    Kasi schrieb:

    und warum du immer alles in einem Datenmodell einlesen willst ist mir schleierhaft
    Tja, das halte ich numal für den Königsweg.
    Dieselben Daten mehrmals einlesen, mal in ein DGV (was kein Datenmodell ist), mal in eine Combobox (was kein Datenmodell ist), und demnächst noch in irgendetwas anderes - was bislang nicht gesagt wurde.

    Das ist numal einfach gruselig.
    Ändert sich die Datenstruktur ist das aufwändig und fehleranfällig, die verschiedenen Stellen und ArtundWeisen des Einlesens zu pflegen.
    Mehr oder weniger absehbar ist auch, dass iwann mal Daten geändert werden, oder gar abzuspeichern sind.
    Dann steht man vor so Phänomenen, dass inne Combobox meinetwegen etwas angezeigt wird, was im DGV aber nicht mehr da ist.
    ("Inkonsistenz wegen Redundanzen" - ums in Programmierer-Sprech zu sprechen.)

    Das ist, "warum ich immer alles in ein Datenmodell einlesen will".
    Ich präzisiere: Ich will es immer in ein einziges Datenmodell einlesen. Das Prinzip dahinter lautet "RedundanzVermeidung".
    Und dieses Prinzip ist inne Programmierung halt überlebenswichtig. Wer da schlampert, oder sich einen schlechten Stil angewöhnt (und das ist genau, was ich hier in Entstehung begriffen sehe) wird mittelfristig aussterben.

    Ich gerate da sogar ins philosophieren - also man kann das Prinzip "RedundanzVermeidung" gradezu als die "Mutter der Programmierung" betrachten.
    Denn was ist zB eine Funktion anderes als dass man eine Abfolge von Anweisungen zusammenfasst, um sie von vielen Stellen aus aufzurufen, anstatt die Anweisungen an jeder Stelle immer wieder (redundant) neu zu formulieren?
    /OT

    BTT:
    Ein weiterer Effekt eines Datenmodells ist, dass man Databinding anwenden kann.
    Also deine Methode (post#31) könnteman unter Verwendung von Databinding auf einen Einzeiler eindampfen, der einen bindingSource-Filter setzte, und gut wär:

    VB.NET-Quellcode

    1. bsTheDataTable.Filter = $"Date >= {datumVon} and Date < {datumbis}"
    so ungefähr.



    Übrigens ich bin wohl wirklich etwas begriffstutzig.
    Ich hab wirklich nicht verstanden, was "Daten nach Datum und Uhrzeit auslesen (von - bis)." bedeutet.
    Ich hab gedacht, er will die Textzeilen nach der 3. Spalte auslesen, und iwie neue Datensätze bilden oder sowas.
    Weil wenn man seine Datenbeispiele anguckt - Spalte2 ist ein Datum, Spalte3 eine Uhrzeit - da dachte ich, er will auslesen, was in der jeweiligen TextZeile danach kommt.

    Aber deine Interpretation, dasses hier um einen Zeit-Filter geht, findich jetzt ganz plausibel.
    Und denke fast, du hast damit dem TE die Arbeit abgenommen, es selbst klar zu formulieren.

    Dieser Beitrag wurde bereits 13 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Vollzitat eines Vorposts durch Anredefunktion ersetzt ~VaporiZed
    @Kasi

    Kasi schrieb:

    z.b. den Namen 'aal'
    diese sollen dann zusätzlich aus einem bestimmten Zeitraum sein
    Datum von - bis



    Hallo Kasi,

    am Anfang an Du hast mich gut verstanden und sehr gut erklärt.

    Ich bin nicht Profi in VB.net, im Jahr 2 oder 3 Anwendungen geschrieben.

    Ich versuche mit deine Code und gebe ich ein Feedback.

    Vielen Dank für die Unterstützung.

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

    Hi Kasi,

    es hat klappt, soweit OK.

    Danke!

    Mit dem Datum fromDate und toDate habe ich noch fragen.

    1) Anfangsdatum und Endedatum eine der selbentag ist, dann liest das nicht.

    z.B.: fromDate " 25.09.2020" und toDate "25.09.2020 ", so funktioniert nicht

    wenn ich den fromDate "24.09.2020"; toDate "25.09.2020"; eingebe dann liest der.

    aal;25.09.2020; 08:31:26;False;3,7;-30;36;162,7;17,8;2;8;220,5;20;-22;38;211,4;;;
    aal;25.09.2020; 08:32:45;False;3,1;39;-131;29,3;50,1;2;-5;16,8;53,1;17;-56;17,5;;;
    AB;25.09.2020; 08:36:52;False;3,1;39;-131;29,3;50,1;2;-5;16,8;53,1;17;-56;17,5;;;
    LR;25.09.2020; 08:47:13;False;3,1;-95;-100;253,2;50;-8;0;316,8;51,5;-40;-38;313,7;;;
    LR;26.09.2020; 08:50:18;False;6,5;5;72;134,2;26,7;11;11;174,8;32;15;69;167,2;;;


    VB.NET-Quellcode

    1. 'ändere zu DateTimePicker
    2. Dim fromDate As DateTime = StartDate.Value
    3. Dim toDate As DateTime = EndDate.Value
    4. Dim xName As String = ComboBox1.Text
    5. 'Query auslösen
    6. Dim results = (From line In File.ReadAllLines("C:\DATA\test.csv").Skip(1) _
    7. Let fields = line.Split(New Char() {";"c}).AsEnumerable() _
    8. Where DateTime.Parse(fields.ElementAt(1)) >= fromDate AndAlso _
    9. DateTime.Parse(fields.ElementAt(1)) < toDate AndAlso _
    10. fields.ElementAt(0) = xName Select fields).ToArray()
    11. 'elemente zurück geben
    12. 'hier in DGV darstellen
    13. 'zum Test an Debug fenster ausgeben
    14. For Each element In results
    15. 'DataGridView1.DataSource = (element(0) & " : " _
    16. ' & element(1) & " : " _
    17. ' & element(2) & " : " _
    18. ' & element(3) & " : " _
    19. ' & element(4) & " : " _
    20. ' & element(5))
    21. Dim NewRow As DataRow = thedatatable.NewRow
    22. NewRow("Name") = element(0)
    23. NewRow("Date") = element(1)
    24. NewRow("Time") = element(2)
    25. NewRow("True/False") = element(8)
    26. NewRow("Eb1") = element(4)
    27. NewRow("Wil") = element(5)
    28. NewRow("Eb2") = element(6)
    29. NewRow("Wi2") = element(7)
    30. NewRow("Stat") = element(9)
    31. NewRow("Wi_s") = element(3)
    32. thedatatable.Rows.Add(NewRow)
    33. Next
    34. 'thereader.Close()
    35. DataGridView1.DataSource = thedatatable


    2) Du hast recht mit Datum und Uhrzeit, die beiden sollten in eine Spalte sein.

    Name;Date/Time;OK;Eb;Ebe1_x;Eb1_y;Eb_&deg;;Eb_g;Eb_x;Eb_y;Eb_&deg;;st_g;st_x;st_y;st_&deg;;<br />
    aal<u>;25.09.2020 08:31:26;</u>False;3,7;-30;36;162,7;17,8;2;8;220,5;20;-22;38;211,4;;;<br />
    aal;25.09.2020 08:32:45;False;3,1;39;-131;29,3;50,1;2;-5;16,8;53,1;17;-56;17,5;;;<br />
    AB;25.09.2020 08:36:52;False;3,1;39;-131;29,3;50,1;2;-5;16,8;53,1;17;-56;17,5;;;<br />
    LR;25.09.2020 08:47:13;False;3,1;-95;-100;253,2;50;-8;0;316,8;51,5;-40;-38;313,7;;;<br />
    LR;26.09.2020 08:50:18;False;6,5;5;72;134,2;26,7;11;11;174,8;32;15;69;167,2;;;</p>


    Kann ich 2 DateTimepicker benutzen stat eine?

    Eine für Date und eine für Time?

    Wenn Ja, wie muss ich den Code ändern, Date & Time zusammen sind.

    VB.NET-Quellcode

    1. Dim fromDate As DateTime = StartDate.Value & StartTime.Value
    2. Dim toDate As DateTime = EndDate.Value & EndTime.Value


    Vielen Dank,

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

    Kann ich 2 DateTimepicker benutzen stat eine?

    Eine für Date und eine für Time?


    du verwendest 2 DTP, eine für Start und eine Ende

    setzte das ins Form Load

    VB.NET-Quellcode

    1. 'Beispiel Datum mit Uhrzeiten
    2. DateTimePicker1.Format = DateTimePickerFormat.Custom
    3. DateTimePicker1.CustomFormat = "dd.MM.yyyy HH:mm:ss"
    4. Dim fromDate As DateTime = New DateTime(2017, 10, 25, 7, 42, 22)
    5. DateTimePicker2.Format = DateTimePickerFormat.Custom
    6. DateTimePicker2.CustomFormat = "dd.MM.yyyy HH:mm:ss"
    7. Dim toDate As DateTime = New DateTime(2017, 10, 25, 8, 47, 59)
    8. DateTimePicker1.Value = fromDate
    9. DateTimePicker2.Value = toDate


    den rest solltest du alleine schaffen