Hallo!
Damit das Thema für die Mitlesenden verständlich wird,
zunächst der Link auf den Beispielcode, der der Anfrage zugrunde liegt.
Zum Lesen des Inhalts der CSV-Dateien wird dabei die Klasse cDataTableCSV verwendet.
Wenn eine Datarelation verwendet werden soll, die sich auf Teil-Strings innerhalb
eines Spalten-Inhalts bezieht, ist eine neue Spalte in der Tabelle zu erstellen,
in die dieser Teil-String zeilenweise eingetragen wird.
Die Klasse "cDataTableCSV" enthält die Methode "AddColumn", die eine zusätzliche
leere Spalte in der Tabelle anfügt.
In Deinem Fall könnte eine Routine deshalb etwa so aussehen:
(Zeilen mit nicht-numerischem Teilstring am Content-Ende werden mit dem
Sonderwert DBNull belegt und beim autom. Aufbau der Relation deshalb ignoriert!)
Private Function CreateNumberColumn(ByVal dt As cDataTableCSV, _
ByVal ColumnEndswithNumber As String) As String
Dim ColumnWithNumber As String = ""
If Not dt.Columns.Contains(ColumnEndswithNumber) Then
Throw New ArgumentException _
("Die Spalte " & ColumnEndswithNumber & _
" ist nicht in der Tabelle vorhanden")
End If
dt.AddColumn() 'Spalte in Tabelle anfügen
'Name der neuen Spalte abfragen
ColumnWithNumber = dt.Columns(dt.Columns.Count - 1).ColumnName
'Hilfsvariable
Dim field As String, parts() As String, numberpart As String
Dim number As Integer
For Each row As DataRow In dt.Rows
field = row(ColumnEndswithNumber).ToString() 'Feldinhalt abfragen
parts = field.Split(" "c) 'Feldinhalt am Trennzeichen aufspalten
numberpart = parts(parts.Length - 1) 'Letzter Abschnitt (=Nummer)
'Prüfen, ob der letzte Teilstring als Integer darstellbar ist
If Integer.TryParse(numberpart, number) Then
'Nummer in der neuen Spalte als Zeichenfolge eintragen
row(ColumnWithNumber) = number.ToString
Else
'keine Ziffernfolge im letzten Teilstring !!!
row(ColumnWithNumber) = DBNull.Value
End If
Next row
'Name der neuen Spalte zurückgeben
Return ColumnWithNumber
End Function Anwendung der Routine (Spalten-Bezeichner sind anzupassen).
(Der Typ der Tabellen im Dataset muß beim Methodenaufruf gecastet (DirectCast)
werden, weil das Dataset Instanzen der Datatable-Klasse enthält, die Methode
aber als Parameter Instanzen der davon abgeleiteten Klasse "cDataTableCSV"
benötigt.)
'Die beiden CSV-Dateien laden
ds.Tables.Add(LoadCSV("C:\daten\csv1.csv"))
ds.Tables.Add(LoadCSV("C:\daten\csv2.csv"))
If Not ds.Tables.Count = 2 Then
MessageBox.Show("Eine Datei konnte nicht gelesen werden")
Exit Sub
End If
'Neue Spalten erstellen und Zeilen mit dem Teilstring (=Nummer) füllen
Dim columnwithnumber1 As String = _
CreateNumberColumn(DirectCast(ds.Tables(0), cDataTableCSV), "SP_13")
Dim columnwithnumber2 As String = _
CreateNumberColumn(DirectCast(ds.Tables(1), cDataTableCSV), "SP_2")
'Datarelation für die neuen Spalten anpassen
Dim dr As New DataRelation _
("Artikel", ds.Tables(0).Columns(columnwithnumber1), _
ds.Tables(1).Columns(columnwithnumber2))
ds.Relations.Add(dr) Du mußt diese Abläufe noch einmal sorgfältig durchdenken.
Eine "Datarelation" bezieht sich stets auf die Korrespondenz des gesamten Inhalts
der angegebenen Spalten-Paarung. Die "Datarelation" und die zugrundeliegenden
Daten müssen deshalb angepaßt werden, nicht der Code zum Erstellen der Zeilen
in der Datatable, die für die Ausgabe der kombinierten Daten gefüllt wird !!
(In der Praxis beziehen sich DataRelations auf Spalten, die Schlüssel-Werte
enthalten).
|