DataSet / CSV Spalte durchsuchen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Mukkes.

    DataSet / CSV Spalte durchsuchen

    Hallo Gemeinde,

    Ich versuche einen Filter anzuwenden der mir in einer CSV Datei die Spalte 0 "SP_0" nach dem Wort "test" durchsucht.
    Wurde dieses Wort gefunden soll nun in Spalte 2 "SP_2" nach den Zahlen "2200-2300" gesucht werden.
    Wurde diese auch gefunden möchte ich in eine neue Spalte einen Wert eintragen.
    Im Code unten ist die neue Spalte "Kato" und der Wert "test0815".

    VB.NET-Quellcode

    1. Dim bs As New BindingSource
    2. bs.DataSource = ds
    3. 'Datensatz-Filter setzen
    4. bs.Filter = "SP_0 = 'test' AND SP_2 >= 2200 AND SP_2 <= 2300"
    5. 'Gefilterte Datensätze bearbeiten
    6. For i As Integer = 0 To bs.Count - 1
    7. Dim r As DataRow = DirectCast(bs(i), DataRowView).Row
    8. row("Kato") = "test0815"
    9. Next i
    10. 'Filter entfernen
    11. bs.Filter = ""


    Wenn ich nun die CSV lade bekomme ich diesen fehler angezeigt:

    Abbruch - Fehler: Das Objekt des Typs
    "System.Data.DataViewManagerListItemTypeDescriptor" kann nicht in Typ
    "System.Data.DataRowView umgewandelt werden.


    Wie kann ich denn den Fehler beheben ?(

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

    Lies die CSV doch einfach in eine Datatable ein. Die lässt sich dann einfacher filtern
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Das hab ich ja soweit schon.

    Hier mal mein ganzer Code

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports System.Net
    4. Imports System.Text
    5. Imports CSV_Converter
    6. Imports CSV_Converter.Katdts
    7. Public Class Form1
    8. Private _DataFile As New FileInfo("katds.xml")
    9. Dim ds As New DataSet
    10. Dim dt1, dt2, dtout As cDataTableCSV
    11. 'Hauptfunktion #########
    12. Private Function LoadCSV(file As String) As cDataTableCSV
    13. 'CSV Datei laden - ggf. Schlüssel festlegen
    14. Dim dt As New cDataTableCSV
    15. dt.TableName = IO.Path.GetFileNameWithoutExtension(file)
    16. If Not dt.LoadFile(file, System.Text.Encoding.Default) Then Return _
    17. Nothing
    18. 'dt.PrimaryKey = New DataColumn() {dt.Columns(0)}
    19. Return dt
    20. End Function
    21. 'CSV-File lesen #########
    22. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
    23. Button1.Click
    24. Dim file_open As New OpenFileDialog
    25. file_open.Filter = "csv-dateien|*.csv"
    26. file_open.AddExtension = True
    27. If file_open.ShowDialog = DialogResult.OK Then
    28. ds.Tables.Clear()
    29. ds.Tables.Add(LoadCSV(file_open.FileName))
    30. If Not ds.Tables.Count = 1 Then
    31. MessageBox.Show("Eine Datei konnte nicht gelesen werden")
    32. Exit Sub
    33. End If
    34. 'Spalten in Ausgabedatei erstellen
    35. dtout = New cDataTableCSV
    36. dtout.Columns.Add("Action") : dtout.Columns.Add("Category")
    37. dtout.Columns.Add("Title") : dtout.Columns.Add("Beschreibung")
    38. dtout.Columns.Add("Kato")
    39. '+++++++ Habe ich etwas gekürzt ++++++++++++
    40. 'Spalteninhalte einer Zeile als Zeichenfolge kombinieren
    41. Dim line As New System.Text.StringBuilder
    42. 'Zeilen als Zeichenfolge kombinieren
    43. Dim text As New System.Text.StringBuilder
    44. dtout.Rows.Add({"*Action", "*Category", "*Title",
    45. "*Description", "Kato"})
    46. Try
    47. For rowindex As Integer = 1 To ds.Tables(0).Rows.Count - 1
    48. 'zusätzliche Zeile einfügen
    49. Dim row As DataRow = ds.Tables(0).Rows(rowindex)
    50. 'Ausgabedatensatz aufbauen
    51. Dim orow As DataRow = dtout.NewRow
    52. orow("Action") = "Add"
    53. orow("Category") = KategoriennummerTextBox.Text
    54. orow("Title") = row("SP_0") & " " & row("SP_1") & " " &
    55. ComboBox.Text & " - Art.Nr. " & row("SP_2")
    56. orow("Beschreibung") = TextBox5.Text & row("SP_3").ToString _
    57. & TextBox6.Text
    58. '+++++++ Habe ich etwas gekürzt ++++++++++++
    59. ' Versandkosten ermitteln Spalte 6 #########
    60. '1.Schritt:
    61. Dim val As String = row("SP_6").ToString
    62. '1a.)
    63. val = val.Replace("."c, ",")
    64. '2.Schritt:
    65. Dim dec As Decimal
    66. '3.Schritt:
    67. If Decimal.TryParse(val, dec) Then
    68. '4. Schritt:
    69. If dec <= 70 Then
    70. orow("Versandkosten") = "5,9"
    71. Else
    72. orow("Versandkosten") = "0"
    73. End If
    74. Else
    75. orow("Versandkosten") = "" 'Leerstring oder
    76. ' Missing-Kennung zuweisen
    77. End If
    78. ' Preis ermitteln #########
    79. '1.Schritt:
    80. Dim val2 As String = row("SP_6").ToString
    81. '1a.)
    82. val2 = val2.Replace("."c, ",")
    83. '2.Schritt:
    84. Dim dec1 As Decimal
    85. '3.Schritt:
    86. If Decimal.TryParse(val2, dec1) Then
    87. '4. Schritt:
    88. If dec1 = 0 Then
    89. orow("Preis") = row("SP_5")
    90. End If
    91. Else
    92. orow("Preis") = "" 'Leerstring oder Missing-Kennung
    93. ' zuweisen
    94. End If
    95. ' Stückzahl festlegen #########
    96. '1.Schritt:
    97. Dim val4 As String = row("SP_4").ToString
    98. '1a.)
    99. val4 = val4.Replace("."c, ",")
    100. '2.Schritt:
    101. Dim dec4 As Decimal
    102. '3.Schritt:
    103. If Decimal.TryParse(val4, dec4) Then
    104. '4. Schritt:
    105. If dec4 >= 20 Then
    106. orow("Stückzahl") = "10"
    107. End If
    108. Else
    109. orow("Stückzahl") = "" 'Leerstring oder Missing-Kennung
    110. ' zuweisen
    111. End If
    112. ' EAN festlegen #########
    113. '1.Schritt:
    114. Dim val5 As String = row("SP_7").ToString
    115. '1a.)
    116. val5 = val5.Replace("."c, ",")
    117. '2.Schritt:
    118. Dim dec5 As Decimal
    119. '3.Schritt:
    120. If Decimal.TryParse(val5, dec5) Then
    121. '4. Schritt:
    122. If dec5 = Nothing Then
    123. orow("EAN") = row("SP_7")
    124. End If
    125. Else
    126. orow("EAN") = "Nicht zutreffend" 'Leerstring oder
    127. ' Missing-Kennung zuweisen
    128. End If
    129. ' Tabelle Füllen #########
    130. dtout.Rows.Add(orow)
    131. 'Ausgabe-Datensatz als Text aufbereiten
    132. line.Clear()
    133. For i As Integer = 0 To orow.ItemArray.Length - 1
    134. line.Append(orow(i).ToString & ";")
    135. Next i
    136. Next rowindex
    137. Catch ex As Exception
    138. MessageBox.Show("Abbruch - Fehler: " & ex.Message)
    139. Exit Sub
    140. End Try
    141. 'Ausgabe als Text anzeigen
    142. DataGridView1.DataSource = dtout
    143. DataGridView1.CurrentCell = Nothing
    144. DataGridView1.Rows(0).Visible = False
    145. End If
    146. End Sub
    147. End Class


    Habe auch mittlerweile den Fehler gefunden hatte die Falsche DataSource ^^

    bs.DataSource = ds habe ich bs.DataSource = dtout gemacht und schon kommt der fehler nicht mehr.

    Nur leider funzt der Filter nicht so ganz denn ich bekomme in die neue Spalte Kato keine werte eingetragen und wenn ich die CSV Öffne per Button braucht das Tool sehr lange bis ich ein Ergebniss im DGV angezeigt bekomme.
    Hallo,

    Habe es nun zum laufen gebracht.

    Aber ist es möglich mehrere BindingSource Filter zu nutzen ?

    Habe schon festegestellt das ich nicht zwei Filter gleichzeitig laufen lassen kann, da der neue den alten immer überschreibt.


    VB.NET-Quellcode

    1. dtout.Columns.Add("Mark") : dtout.Columns.Add("Art") : dtout.Columns.Add("Kato")
    2. 'Filter anwenden
    3. Dim bs As New BindingSource
    4. Dim bs2 As New BindingSource
    5. bs.DataSource = dtout
    6. bs2.DataSource = dtout
    7. 'Datensatz-Filter setzen
    8. bs.Filter = "Mark = 'Haus' AND Art >= 1050 AND Art <= 1055"
    9. bs2.Filter = "Mark = 'Wetter' AND Art >= 232334 AND Art <= 232345"
    10. 'Gefilterte Datensätze bearbeiten
    11. For i As Integer = 0 To bs.Count - 1
    12. Dim r As DataRow = DirectCast(bs(i), DataRowView).Row
    13. r("Kato") = "selected"
    14. Next i
    15. For i As Integer = 0 To bs.Count - 1
    16. Dim r As DataRow = DirectCast(bs2(i), DataRowView).Row
    17. r("Kato") = "Hallo"
    18. Next i
    19. 'Filter entfernen
    20. bs.Filter = ""

    erstelle dir doch eine zweite tabelle und lasse die datensätze die zutreffen temporär dort rein kopieren/importieren.
    dann könntest du die filter nacheinander abfahren.

    nur so eine idee auf die schnelle ohne alles gelesen szu haben.
    Gruß Hannes

    VB1963 schrieb:

    Verknüpfe beide Filterausdrücke mit ODER..


    Hallo,

    Vielen Dank für den Tipp das hat mein Problem fast gelöst. :)

    Habe nun es so:

    VB.NET-Quellcode

    1. bs.Filter = "Mark = 'Haus' AND Art >= 1050 AND Art <= 1055 Or Mark = 'Wetter' AND Art >= 232334 AND Art <= 232345"


    Jetzt habe ich nur noch das Problem wie ich diese beide zusammen fügen kann.

    VB.NET-Quellcode

    1. 'Gefilterte Datensätze bearbeiten
    2. For i As Integer = 0 To bs.Count - 1
    3. Dim r As DataRow = DirectCast(bs(i), DataRowView).Row
    4. r("Kato") = "selected"
    5. Next i
    6. For i As Integer = 0 To bs.Count - 1
    7. Dim r As DataRow = DirectCast(bs2(i), DataRowView).Row
    8. r("Kato") = "Hallo"
    9. Next i


    Denn bei Haus soll in die neue Spalte Kato das Wort "selected" und bei Wetter soll in die neue Spalte Kato das Wort "Hallo"
    Hallo,

    Habe mein Problem lösen können.

    Verwende es nun so, sieht zwar nicht so elegant aus da man dies sicherlich noch etwas kombinieren könnte. Denn bei mehreren Filtern wird der Code sehr lange. Aber es erfüllt seinen Zweck :D

    VB.NET-Quellcode

    1. 'Erster Filter anwenden ######################################
    2. Dim bs As New BindingSource
    3. bs.DataSource = dtout
    4. 'Datensatz-Filter setzen
    5. bs.Filter = "Mark = 'Wetter' AND Art >= 1050 AND Art <= 1055 Or Mark = 'Haus' AND Art >= 232342 AND Art <= 232359"
    6. 'Gefilterte Datensätze bearbeiten
    7. For i As Integer = 0 To bs.Count - 1
    8. Dim r As DataRow = DirectCast(bs(i), DataRowView).Row
    9. r("Kato") = "selected"
    10. Next i
    11. 'Filter entfernen
    12. bs.Filter = ""
    13. 'Zweiter Filter anwenden ######################################
    14. Dim bs2 As New BindingSource
    15. bs2.DataSource = dtout
    16. 'Datensatz-Filter setzen
    17. bs2.Filter = "Mark = 'Baum' AND Art >= 2200 AND Art <= 2300 Or Mark = 'Wetter' AND Art >= 1102 AND Art <= 1133 Or Mark = 'Haus' AND Art >= 232330 AND Art <= 232340"
    18. 'Gefilterte Datensätze bearbeiten
    19. For i As Integer = 0 To bs.Count - 1
    20. Dim r As DataRow = DirectCast(bs2(i), DataRowView).Row
    21. r("Kato") = "Hallo"
    22. Next i
    23. 'Filter entfernen
    24. bs2.Filter = ""