Daten schnell auslesen von CSV Datei

  • VB.NET

Es gibt 54 Antworten in diesem Thema. Der letzte Beitrag () ist von Toni_Edi.

    Daten schnell auslesen von CSV Datei

    Hallo Freunde,
    Ich möchte von CSVdatei nach Datum und Uhrzeit lesen.
    Soweit funktioniert es, aber nur noch bis 500 Zeile.Ich habe hier 5000 Zeile.
    Es liest so langsam manchmal bleibt hängen (keine Rückmeldung).
    Hat jemand eine Idee?
    Die Zeile sind nach Datum und Uhrzeit gespeichert.

    Meine Daten:
    Name;Date/Time;OK;Eb;Ebe1_x;Eb1_y;Eb_°;Eb_g;Eb_x;Eb_y;Eb_°;st_g;st_x;st_y;st_°;
    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;;;
    CPLA;24.10.2020 10:09:05;False;0,7;-70;-89;337,2;3,8;-2;0;283,6;4,2;-58;-71;292,5;;;
    CPLA;26.10.2020 10:09:10;True;2,2;-50;-86;318,7;36,7;-2;-2;330,4;38,9;-42;-73;329,8;;;
    CPLA;26.10.2020 10:09:48;False;3,7;-39;-14;213,6;15;-5;8;291,1;16,2;-35;-4;278;;;
    CPLA;26.10.2020 10:10:29;True;5,1;-70;33;169,6;28,2;0;14;243,2;30,1;-53;38;233,8;;;
    CPLA;28.10.2020 10:11:14;False;2,1;-14;-14;297,7;7,9;-2;0;311,3;10;-15;-13;308,5;;;
    AB;26.10.2020 10:11:55;True;12,3;2;-58;200,4;21,3;-11;30;4,1;10,1;-4;-20;344,1;;;
    AA;27.10.2020 10:15:56;True;1,1;-47;-5;350,3;17,2;0;-2;278;17,6;-38;-6;281,7;;;
    ABA;27.10.2020 10:16:37;True;1;-11;-50;209,3;19,1;0;0;346,7;18,3;-8;-38;344,5;;;
    ABA1;27.10.2020 10:17:19;True;1,3;-5;-58;6,7;21,7;0;-2;353,2;23,1;-4;-51;354;;;
    ABD;27.10.2020 10:30:41;True;3,8;-89;25;184,9;34,1;0;8;253,1;35,7;-71;29;247,3;;;
    Mein Code:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim xName As String = ComboBox1.Text
    3. Dim fromDate As DateTime = StartDate.Value.Date ' + StartTime.Value.TimeOfDay
    4. Dim toDate As DateTime = EndDate.Value.Date ' + EndTime.Value.TimeOfDay
    5. Dim results = (From line In File.ReadAllLines(TextBox1.Text).Skip(1) _
    6. Let fields = line.Split(New Char() {";"c}).AsEnumerable() _
    7. Where DateTime.Parse(fields.ElementAt(1)) >= fromDate AndAlso _
    8. DateTime.Parse(fields.ElementAt(1)) <= toDate AndAlso _
    9. fields.ElementAt(0) = xName Select fields).ToArray()
    10. For Each element In results
    11. Dim NewRow2 As DataRow = thedatatable2.NewRow
    12. NewRow2("Name") = element(0)
    13. NewRow2("Date") = element(1)
    14. NewRow2("True/False") = element(2)
    15. NewRow2("Eb1") = element(4)
    16. NewRow2("Wil") = element(5)
    17. NewRow2("Eb2") = element(6)
    18. NewRow2("Wi2") = element(7)
    19. NewRow2("Stat") = element(9)
    20. NewRow2("Wi_s") = element(3)
    21. thedatatable2.Rows.Add(NewRow2)
    22. Next
    23. DataGridView1.DataSource = thedatatable2
    24. end sub


    *Topic verschoben*

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Ich habe mir dein Problem gar nicht angesehen, was ich nämlich sofort sehe ist, dass die Daten die du zeigts, völlig kaputt sind.
    Nach genauerem Hinsehen:
    - Die Anzahl der Spalten (Kopfzeile) stimmt nirgends mit der jeweiligen Anzahl Spalten Detailzeile überein. (Kontrolle: Semikolons zählen)
    - Das "Date/Time" Feld ist in den ersten 5 Detailzeilen getrennt worden mit einem Semikolon zwischen Date und Time
    Es ist unnötig eine leere Spalte hinten anzufügen (abschliessendes Semikolon), Datentechnisch gesehen ist es eine "Leer-Spalte"

    Bereinige erst mal den Datenmüll

    Dksksm schrieb:

    Ich habe mir dein Problem gar nicht angesehen, was ich nämlich sofort sehe ist, dass die Daten die du zeigts, völlig kaputt sind.
    Nach genauerem Hinsehen:
    - Die Anzahl der Spalten (Kopfzeile) stimmt nirgends mit der jeweiligen Anzahl Spalten Detailzeile überein. (Kontrolle: Semikolons zählen)
    - Das "Date/Time" Feld ist in den ersten 5 Detailzeilen getrennt worden mit einem Semikolon zwischen Date und Time
    Es ist unnötig eine leere Spalte hinten anzufügen (abschliessendes Semikolon), Datentechnisch gesehen ist es eine "Leer-Spalte"


    Dksksm schrieb:

    Bereinige erst mal den Datenmüll


    Hi Dksksm,

    ich habe versucht nur nach Datum und Datumuhrzeit lesen.
    Es dauert immer noch so lange.

    Hier suche ich nur "Name" von Column 1 list in paar sekunden.

    VB.NET-Quellcode

    1. Dim Name_List As New List(Of String)
    2. Dim ReadFile = IO.File.ReadAllLines(TextBox1.Text).Skip(1)
    3. Name_List =
    4. (
    5. From line In ReadFile
    6. Where line.Length > 0 Let Items = line.Split(";"c) _
    7. Select yourItem = Items(1)
    8. Distinct
    9. Order By yourItem
    10. ).ToList
    11. ComboBox1.DataSource = Name_List
    @Toni_Edi
    du musst auch Lesen was @Dksksm geschrieben hat !!

    abgesehen davon ist das hier quatsch

    VB.NET-Quellcode

    1. Dim fromDate As DateTime = StartDate.Value.Date
    2. Dim toDate As DateTime = EndDate.Value.Date


    benutzte DateTimepicker wie ich es in dem anderen Thread erwähnte

    VB.NET-Quellcode

    1. Dim fromDate As DateTime = DateTimePicker1.Value
    2. Dim toDate As DateTime = DateTimePicker2.Value
    Ist zwar nicht mein Bier, aber wieso sollte das Quatsch sein? Unter der Annahme, dass StartDate und EndDate bereits DateTimePicker sind, ist das sogar richtig, was er macht. Denn das .Value.Date "filtert" auf einfachem Weg den Datumsteil aus einer DTP-Eingabe und entfernt quasi die unsichtbare Zeitkomponente, indem diese auf Mitternacht gesetzt wird. Denn in jeder DTP-Eingabe steckt auch (ggf. unsichtbar) eine Zeit drin. Und die kann, wenn man sie wie in Deinem Vorschlag, nicht beachtet, zu merkwürdigen Ergebnissen bei Berechnungen führen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Toni_Edi schrieb:

    Dksksm schrieb:


    ich habe versucht nur nach Datum und Datumuhrzeit lesen.
    Es dauert immer noch so lange.


    Du hast wirklich nicht gelesen was ich geschrieben habe, von deinem Code habe ich nicht gesprochen, nur von den Daten. Wenn die Daten schon Murks sind, kannst du sie ohnehin nicht ordentlich verarbeiten.

    Um jetzt doch etwas zur Verarbeitung zu sagen, wenn Du sozusagen die eierlegende Wollmilchsau (Einzeiler) zum verarbeiten aller Zeilen auf einmal haben willst, müssen die Daten korrekt sein.
    Sind sie aber nicht. Also kann man hier so vorgehen, als Gerüst:
    - Erst einmal nur die Kopfzeile einlesen in eine List<String> und diese Parsen, Leerstrings in der Kopfzeile dürften in keinem Feld erlaubt sein.
    - Zeilenweise Detailzeilen einlesen und die Länge (Anzahl Elemente) mit der Kopfzeile vergleichen. Bei ungleichheit eine entsprechende Report-Zeile schreiben und die Zeile überspringen, nächste Zeile lesen bis Dateiende.
    - Zeilen die positiv geprüft sind können jetzt geparst und in die Tabelle oder List(of T) übernommen werden.
    - Zum Schluß, Fehlerprotokoll darstellen.

    Zitatfunktionsfehler korrigiert ~VaporiZed

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

    @Toni_Edi Wo genau bleibt er hängen (mach mal ein Break wenn er hängt):
    Zeile 6-9 (meine Vermutung)
    oder
    ab Zeile 12?
    Falls ersteres mach mal einen Konstrukt ohne LINQ.
    LINQ ist zwar elegant, nicht aber performant.
    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!

    Dksksm schrieb:

    - Das "Date/Time" Feld ist in den ersten 5 Detailzeilen getrennt worden mit einem Semikolon zwischen Date und Time


    Dksksm schrieb:

    Ich habe mir dein Problem gar nicht angesehen, was ich nämlich sofort sehe ist, dass die Daten die du zeigts, völlig kaputt sind.
    Nach genauerem Hinsehen:
    - Die Anzahl der Spalten (Kopfzeile) stimmt nirgends mit der jeweiligen Anzahl Spalten Detailzeile überein. (Kontrolle: Semikolons zählen)
    - Das "Date/Time" Feld ist in den ersten 5 Detailzeilen getrennt worden mit einem Semikolon zwischen Date und Time
    Es ist unnötig eine leere Spalte hinten anzufügen (abschliessendes Semikolon), Datentechnisch gesehen ist es eine "Leer-Spalte"

    Bereinige erst mal den Datenmüll


    Toni_Edi schrieb:

    - Die Anzahl der Spalten (Kopfzeile) stimmt nirgends mit der jeweiligen Anzahl Spalten Detailzeile überein. (Kontrolle: Semikolons zählen)

    ich habe auch nur nach Datum versucht , dauert auch so lange.

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

    Ich würde wie folgt vorgehen:

    1. ALLE Daten einmalig einlesen
    2. Durch iterieren, die gewünschten Werte raus filtern und diese in eine separate Liste (oder vergleichbares) packen.

    Das oben gepostet Konstrukt schaut nämlich danach aus, das unnötig oft durch Daten iteriert wird... denke daher auch die Anmerkungen von @ErfinderDesRades
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Toni_Edi schrieb:

    Hat jemand eine Idee?
    grad fiel mir was anderes auf: Es scheint ein DGV angebunden zu sein während die Daten in eine DataTable eingelesen werden.
    Vermutlich ist das der Grund - DGV kann Einlese-Vorgänge irrsinnig abbremsen.
    Also täte ich nu empfehlen, während des Ladens das DGV abzukoppeln, mittels DGV.DataSource= Nothing
    Das wieder ankoppeln auf einen anderen Button legen, um wirklich nachweisen zu können, dass es die DGV-Anbindung ist, die die Anwendung blockiert - nicht das Einlesen in die DataTable.
    (also Versuch wärs wert)
    @Toni_Edi Erweiterte Antwort => Dateianhänge => Hochladen
    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 Leseschwäche :?:

    RodFromGermany schrieb:

    Erweiterte Antwort => Dateianhänge => Hochladen
    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:

    Dksksm schrieb:
    - Das "Date/Time" Feld ist in den ersten 5 Detailzeilen getrennt worden mit einem Semikolon zwischen Date und Time

    RodFromGermany schrieb:

    <a href="https://www.vb-paradise.de/index.php/User/28185-Toni-Edi/">@Toni_Edi</a> Leseschwäche <img src="https://www.vb-paradise.de/wcf/images/smilies/question.png" alt=":?:" />
    Zitat von RodFromGermany: „Erweiterte Antwort =&gt; Dateianhänge =&gt; Hochladen“


    Datei hochladen ist ein fehler aufgetreten.

    "Die Datei hat eine ungültige Dateiendung"

    Jetzt habe ich als .TXT

    kann jemanden bitte das anschauen.
    Dateien
    • DATAALL.text.txt

      (59,17 kB, 174 mal heruntergeladen, zuletzt: )

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

    @Toni_Edi Gib uns mal zum Inhalt Deiner Controls usw. so viel Information, dass Dein Code bei uns anspringt.
    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!