csv Datei in ein 2D-array schreiben

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    csv Datei in ein 2D-array schreiben

    Hallo zusammen,

    ich bin ein Anfänger-Programmierer und ich glaube ich gehe folgendes Problem vollkommen falsch an und brauche einen neuen Denkansatz:-)

    Problem:
    Ich habe eine csv Datei die ca. 50.000 - x Zeilen, aber immer 4 Spalten hat. (Anzahl der Zeilen kann man ja mit System.IO.File.ReadAllLines(x).Length auslesen)
    Ich benötige nur die Zeilenzahl wo in der 2, 3 und 4 Spalte in der eine 1 steht (kann öfter vorkommen)

    Mein Ansatz:
    Die komplette Datei in ein 2D-Array (x, 4) einlesen und in den jeweiligen Spalten nach einer 1 suchen.
    Macht das eurer Meinung nach Sinn, oder wird das Suchen und einlesen zu lange dauern?

    Gedachte Umsetzung:

    - Wie das Einlesen funktioniert habe ich noch keine Ahnung, ich habe nur Ansätze mit einer FOR-Schleife gefunden, aber das wären ja in meinem Fall min. 200.000 Durchläufe, da gibts sicher was besseres. (Hab ich aber noch nicht gefunden.
    - Das suchen würde ich mit einer FOR-Schleife machen und alle Werte nacheinander und mit 1 vergleichen - das sind dann aber auch noch 150.000 Durchläufe...

    Ich habe echt Angst dass das Einlesen später ewig dauert und wollte bevor ich damit Anfange erst eine Meinung haben, ob das was ich Vorhabe überhaupt Sinn macht.
    Vielen Dank für eure Hilfe im Vorraus!

    Jochen
    For Schleife ist die einzige Möglichkeit in so einem fall zu suchen und die sind im Normalfall nicht lange...
    Was du machst ist halt direkt mit dem einlesen auch zu suchen, damit sparst du dir schon einmal einen extra durchlauf...
    Zum einlesen verwendest du dann einen StreamReader und die Funktion ReadLine, die einzelnen Zeilen die du dann noch rausbekommst musst du nur noch am Semikolon(oder anderem Trennzeichen trennen, das geht z.B. mit Split
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Vielen Dank für deinen Tipp!
    Ich denke das ich es hinbekommen habe.
    Wenn wer mal auf das Gleiche Problem stößt hier mein Quellcode:

    Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim path As String = "D:\test.csv"
    4. Dim sr As System.IO.StreamReader = New System.IO.StreamReader(path)
    5. Dim aktuelle_Zeile As UInteger
    6. Dim anzahl_Zeilen As UInteger
    7. anzahl_Zeilen = System.IO.File.ReadAllLines(path).Length
    8. TextBox1.Text = anzahl_Zeilen
    9. 'Zeilen Anzahl auslesen
    10. Dim anzahl2SP As UShort = 0
    11. Dim zeilen2sp(anzahl_Zeilen) As UInteger
    12. Dim anzahl3sp As UShort = 0
    13. Dim zeilen3sp(anzahl_Zeilen) As UInteger
    14. Dim anzahl4sp As UShort = 0
    15. Dim zeilen4sp(anzahl_Zeilen) As UInteger
    16. Dim streaminhalt As String = ""
    17. Do
    18. streaminhalt = sr.ReadLine
    19. If streaminhalt.EndsWith(";;;1") = True Then
    20. zeilen4sp(anzahl4sp) = aktuelle_Zeile
    21. anzahl4sp = anzahl4sp + 1
    22. End If
    23. If streaminhalt.EndsWith(";;1;") = True Then
    24. zeilen3sp(anzahl3sp) = aktuelle_Zeile
    25. anzahl3sp = anzahl3sp + 1
    26. End If
    27. If streaminhalt.EndsWith(";;1;1") = True Then
    28. zeilen3sp(anzahl3sp) = aktuelle_Zeile
    29. anzahl3sp = anzahl3sp + 1
    30. zeilen4sp(anzahl4sp) = aktuelle_Zeile
    31. anzahl4sp = anzahl4sp + 1
    32. End If
    33. If streaminhalt.EndsWith(";1;;") = True Then
    34. zeilen2sp(anzahl2SP) = aktuelle_Zeile
    35. anzahl2SP = anzahl2SP + 1
    36. End If
    37. If streaminhalt.EndsWith(";1;;1") = True Then
    38. zeilen2sp(anzahl2SP) = aktuelle_Zeile
    39. anzahl2SP = anzahl2SP + 1
    40. zeilen4sp(anzahl4sp) = aktuelle_Zeile
    41. anzahl4sp = anzahl4sp + 1
    42. End If
    43. If streaminhalt.EndsWith(";1;1;") = True Then
    44. zeilen2sp(anzahl2SP) = aktuelle_Zeile
    45. anzahl2SP = anzahl2SP + 1
    46. zeilen3sp(anzahl3sp) = aktuelle_Zeile
    47. anzahl3sp = anzahl3sp + 1
    48. End If
    49. If streaminhalt.EndsWith(";1;1;1") = True Then
    50. zeilen2sp(anzahl2SP) = aktuelle_Zeile
    51. anzahl2SP = anzahl2SP + 1
    52. zeilen3sp(anzahl3sp) = aktuelle_Zeile
    53. anzahl3sp = anzahl3sp + 1
    54. zeilen4sp(anzahl4sp) = aktuelle_Zeile
    55. anzahl4sp = anzahl4sp + 1
    56. End If
    57. aktuelle_Zeile = aktuelle_Zeile + 1
    58. Loop Until aktuelle_Zeile = anzahl_Zeilen
    59. sr.Close()
    60. TextBox2.Text = anzahl2SP
    61. TextBox3.Text = anzahl3sp
    62. TextBox4.Text = anzahl4sp
    63. Dim a As UInteger = 0
    64. Do
    65. TextBox5.Text = TextBox5.Text & zeilen2sp(a) & ","
    66. a = a + 1
    67. Loop Until a = anzahl2SP
    68. a = 0
    69. Do
    70. TextBox6.Text = TextBox6.Text & zeilen3sp(a) & ","
    71. a = a + 1
    72. Loop Until a = anzahl3sp
    73. a = 0
    74. Do
    75. TextBox7.Text = TextBox7.Text & zeilen4sp(a) & ","
    76. a = a + 1
    77. Loop Until a = anzahl4sp
    78. End Sub
    79. End Class

    jochenld schrieb:

    Wenn wer mal auf das Gleiche Problem stößt hier mein Quellcode
    oder sich meinen äquivalenten Code ansehen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Dim path As String = "D:\test.csv"
    4. Dim aktuelle_Zeile As Integer = 0
    5. Dim alleZeilen() As String = System.IO.File.ReadAllLines(path)
    6. TextBox1.Text = alleZeilen.Length.ToString 'Zeilen Anzahl auslesen
    7. Dim zeilen2sp As New List(Of Integer)
    8. Dim zeilen3sp As New List(Of Integer)
    9. Dim zeilen4sp As New List(Of Integer)
    10. For Each Zeile In alleZeilen
    11. If Zeile.EndsWith(";;;1") Then
    12. zeilen4sp.Add(aktuelle_Zeile)
    13. ElseIf Zeile.EndsWith(";;1;") Then
    14. zeilen3sp.Add(aktuelle_Zeile)
    15. ElseIf Zeile.EndsWith(";;1;1") Then
    16. zeilen3sp.Add(aktuelle_Zeile)
    17. zeilen4sp.Add(aktuelle_Zeile)
    18. ElseIf Zeile.EndsWith(";1;;") Then
    19. zeilen2sp.Add(aktuelle_Zeile)
    20. ElseIf Zeile.EndsWith(";1;;1") Then
    21. zeilen2sp.Add(aktuelle_Zeile)
    22. zeilen4sp.Add(aktuelle_Zeile)
    23. ElseIf Zeile.EndsWith(";1;1;") Then
    24. zeilen2sp.Add(aktuelle_Zeile)
    25. zeilen3sp.Add(aktuelle_Zeile)
    26. ElseIf Zeile.EndsWith(";1;1;1") Then
    27. zeilen2sp.Add(aktuelle_Zeile)
    28. zeilen3sp.Add(aktuelle_Zeile)
    29. zeilen4sp.Add(aktuelle_Zeile)
    30. End If
    31. aktuelle_Zeile += 1
    32. Next
    33. TextBox2.Text = zeilen2sp.Count.ToString
    34. TextBox3.Text = zeilen3sp.Count.ToString
    35. TextBox4.Text = zeilen4sp.Count.ToString
    36. For Each a In zeilen2sp
    37. TextBox5.Text &= a & ","
    38. Next
    39. For Each a In zeilen3sp
    40. TextBox6.Text &= a & ","
    41. Next
    42. For Each a In zeilen4sp
    43. TextBox7.Text &= a & ","
    44. Next
    45. End Sub
    46. End Class
    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!
    Hab es wieder überarbeitet:
    Achtung: Kann sein dass das Programm nicht vollständig ist, da ich nur Ausschnitte kopiert habe.

    VB.NET-Quellcode

    1. Dim FilePath_csv As String = ""
    2. Dim Anzahl_Apnoe As UShort = 0
    3. Dim Anzahl_Snore As UShort = 0
    4. Dim Anzahl_cam As UShort = 0
    5. Dim anzahl_Zeilen_csv As UInteger
    6. Dim aktuelle_Zeile_csv As UInteger = 1
    7. Dim Streaminhalt_csv As String = ""
    8. Private Sub btn_change_data_path_csv_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn_change_data_path_csv.Click
    9. 'Dieses Sub ist zum Auswählen des Pfades der csv Datei. Nachdem die Datei Ausgewählt wurde, werden die letzten Stellen gelesen und in ein Array geschrieben.
    10. OFD_change_csv.Filter = "*.csv|*.csv"
    11. OFD_change_csv.InitialDirectory = "D:\Test.csv"
    12. 'Filtereinstellungen des OFD
    13. If OFD_change_csv.ShowDialog() = Windows.Forms.DialogResult.OK Then
    14. FilePath_csv = OFD_change_csv.FileName
    15. txt_File_name_csv.Text = FilePath_csv
    16. 'Pfad csv in variable und textbox anzeigen
    17. Dim einlesen As System.IO.StreamReader = New System.IO.StreamReader(FilePath_csv)
    18. 'Streamreader initalisieren
    19. anzahl_Zeilen_csv = System.IO.File.ReadAllLines(FilePath_csv).Length
    20. 'Anzahl der Zeilen der CSV Datei auslesen
    21. ReDim Zeilen_Apnoe(anzahl_Zeilen_csv)
    22. ReDim Zeilen_Snore(anzahl_Zeilen_csv)
    23. ReDim Zeilen_Cam(anzahl_Zeilen_csv)
    24. 'Größe der Arrays anpassen um den Fall das alleSpalten=1 abzufangen
    25. aktuelle_Zeile_csv = 0
    26. 'Zeilenzähler zurücksetzen
    27. Do
    28. Streaminhalt_csv = einlesen.ReadLine
    29. 'eine Zeile der csv Datei lesen
    30. If Streaminhalt_csv.Split(";").Length <> 4 Then
    31. MessageBox.Show("Die csv Datei hat " & Streaminhalt_csv.Split(";").Length & " statt wie vorgesehen 4 Spalten. Der Vorgang wird abgebrochen")
    32. Return
    33. End If
    34. 'Gültigkeitsprüfung der csv Datei
    35. If Streaminhalt_csv.EndsWith(";1") Then
    36. Zeilen_Cam(Anzahl_cam) = aktuelle_Zeile_csv
    37. Anzahl_cam = Anzahl_cam + 1
    38. End If
    39. 'Wenn die letzte Zeie eine 1 ist, wird die Zeilennummer in das entsprechende Array geschrieben.
    40. If Streaminhalt_csv.EndsWith(";1;") Or Streaminhalt_csv.EndsWith(";1;1") Then
    41. Zeilen_Snore(Anzahl_Snore) = aktuelle_Zeile_csv
    42. Anzahl_Snore = Anzahl_Snore + 1
    43. End If
    44. 'Wenn die vorletzte Zeie eine 1 ist, wird die Zeilennummer in das entsprechende Array geschrieben.
    45. If Streaminhalt_csv.EndsWith(";1;;") Or Streaminhalt_csv.EndsWith(";1;1;") Or Streaminhalt_csv.EndsWith(";1;;1") Or Streaminhalt_csv.EndsWith(";1;1;1") Then
    46. Zeilen_Apnoe(Anzahl_Apnoe) = aktuelle_Zeile_csv
    47. Anzahl_Apnoe = Anzahl_Apnoe + 1
    48. End If
    49. 'Wenn die drittletzte Zeile eine 1 ist, wird die Zeilennummer in das entsprechende Array geschrieben.
    50. aktuelle_Zeile_csv = aktuelle_Zeile_csv + 1
    51. ' ACHTUNG: die erste csv-Zeile ist im array(0) ->Dadurch ist besser zu rechnen!
    52. Loop Until aktuelle_Zeile_csv = anzahl_Zeilen_csv
    53. 'Dieser vorgang wird wiederholt bis jede Zeile eingelesen wurde
    54. einlesen.Close()
    55. 'Streamreader schließen
    56. ReDim Preserve Zeilen_Apnoe(Anzahl_Apnoe)
    57. ReDim Preserve Zeilen_Snore(Anzahl_Snore)
    58. ReDim Preserve Zeilen_Cam(Anzahl_cam)
    59. 'Größe der Arrays anpassen um Speicher zu spaaren
    60. End If
    61. End Sub
    Ersetze das ganze ReDim und ReDim Preserve durch List(Of ).
    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!