SSIS - Skript-Komponente, Split-single-Reihe auf mehrere Zeilen (Eltern-Kind-Variante)
Vielen Dank im Voraus für Ihre Hilfe. Ich brauche Hilfe beim schreiben von SSIS-Skript-Komponente zu begrenzen einzelne Zeile, mehrere Zeilen. Es gab viele hilfreiche blog-und-post-ich schaute unter:
http://bi-polar23.blogspot.com/2008/06/splitting-delimited-column-in-ssis.html
Jedoch brauche ich ein wenig zusätzliche Hilfe auf die Codierung, um das Projekt abzuschließen. Im Grunde hier ist was ich tun will.
Input-Daten
ID Einzelteil-Name 1 Apple01,02,Banana01,02,03 2 Spoon1,2,Fork1,2,3,4
Output-Daten
ParentID, ChildID Item Name 1 1 Apple01 1 2 Apple02 1 3 Banana01 1 4 Banana02 1 5 Banana03 2 1 Spoon1 2 2 Spoon2 2 3 Fork1 2 4 Fork2 2 5 Fork3 2 6 Fork4
Unten ist mein Versuch code, aber fühlen Sie sich frei, zu überarbeiten das ganze, wenn es illogic. SSIS-Asynchrone Ausgabe eingestellt ist.
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
Dim posID As Integer, childID As Integer
Dim delimiter As String = ","
Dim txtHolder As String, suffixHolder As String
Dim itemName As String = Row.ItemName
Dim keyField As Integer = Row.ID
If Not (String.IsNullOrEmpty(itemList)) Then
Dim inputListArray() As String = _
itemList.Split(New String() {delimiter}, _
StringSplitOptions.RemoveEmptyEntries)
For Each item As String In inputListArray
Output0Buffer.AddRow()
Output0Buffer.ParentID = keyField
If item.Length >= 3 Then
txtHolder = Trim(item)
Output0Buffer.ItemName = txtHolder
'when item length is less than 3, it's suffix
Else
suffixHolder = Trim(item)
txtHolder = Left(txtHolder.ToString(), Len(txtHolder) _
- Len(suffixHolder)) & suffixHolder.ToString()
Output0Buffer.ItemName = txtHolder
End If
Next
End If
End Sub
Den aktuellen code erzeugt die folgende Ausgabe
- ID, Element-Name 1 Apple01 1 02 1 Banana01 1 02 1 03 2 Spoon1 2 2 2 Fork1 2 2 2 3 2 4
Also, welche Fehler sind Sie immer?
Ich habe ein Logik-Problem mit der Codierung. Es ist nicht das Parsen der Zeile, als würde ich es wollte.
Bitte update das Problem mit dem, was der aktuelle code zu produzieren angesichts der oben genannten Eingänge an.
Der aktuelle code nicht Parsen durch Komma als Trennzeichen. Aber es hat die folgenden Probleme. 1) nicht verketten Präfix und suffix.e.g. Ich bekomme Apple01,02 in separaten Zeilen. Es soll ein Ausgang Apple01, Apple02 in separaten Zeilen 2)nicht produzieren parent-child-ID Nummerierung.
Bill, vielen Dank für das feedback. Ich bin neu in Codierung und habe ein problem mit der Problembehandlung
Ich habe ein Logik-Problem mit der Codierung. Es ist nicht das Parsen der Zeile, als würde ich es wollte.
Bitte update das Problem mit dem, was der aktuelle code zu produzieren angesichts der oben genannten Eingänge an.
Der aktuelle code nicht Parsen durch Komma als Trennzeichen. Aber es hat die folgenden Probleme. 1) nicht verketten Präfix und suffix.e.g. Ich bekomme Apple01,02 in separaten Zeilen. Es soll ein Ausgang Apple01, Apple02 in separaten Zeilen 2)nicht produzieren parent-child-ID Nummerierung.
Bill, vielen Dank für das feedback. Ich bin neu in Codierung und habe ein problem mit der Problembehandlung
InformationsquelleAutor ElegantFellow | 2012-03-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich über so pedantisch in dieser Antwort, es ist nicht meine Absicht. Basierend auf dem Kommentar "ich bin neu in Codierung und habe ein problem Problembehandlung" ich wollte einen Spaziergang durch meine Beobachtungen und wie ich zu Ihnen kam.
Problem-Analyse
Der Wunsch ist, teilen Sie eine einzelne Zeile in mehrere Ausgabezeilen basiert auf einem begrenzten Feld verbunden, um die Zeile.
Den code, wie es jetzt steht, ist die Generierung der entsprechenden Anzahl von Zeilen, so dass Sie haben die asynchronen Teil (split) des Skripts zu arbeiten, so ist es ein plus. Was muss passieren, müssen wir 1) Füllen Sie die Child-ID Spalte 2) tragen Sie den Element-Präfix, um alle nachfolgenden Zeilen beim generieren der untergeordneten Elemente.
Behandle ich die meisten jedes problem wie, die. Was versuche ich zu erreichen? Was ist arbeiten? Was nicht funktioniert? Was muss getan werden, damit es funktioniert. ZERLEGUNG von Problemen in kleinere und kleinere Probleme resultiert schließlich in etwas, das Sie kann tun.
Code-Beobachtungen
Einfügen in den mitgelieferten code zu einem Fehler geführt, dass itemList wurde nicht deklariert. Basierend auf Nutzung, es scheint, dass es beabsichtigt war, um sein itemName.
Nach der Festsetzung, die Sie bemerken sollten, die IDE anzeigt, haben Sie 2 unbenutzte Variablen (posID, childID) und dass die
variable txHolder is used before it's been assigned a value. A null reference exception could result at runtime.
Meine Mitarbeiter oft bemerkt Warnungen werden Fehler, die noch nicht erwachsen und doch, so mein Rat an Sie als eine junge Entwickler ist, um die Aufmerksamkeit auf Warnungen, sofern Sie nicht explizit erwarten, dass der compiler Sie warnen: Sie sagte Szenario.Erste Schritte
Wahl zwischen der Lösung der Kind-ID-situation versus der name Präfix - /suffix-Zeug, ich würde mit einem einfach, die Kind-id
Generieren einen Ersatzschlüssel
Dass der ausgefallene Titel Satz, dass, wenn Sie suchte, Sie würde haben viel trifft zu ssistalk oder sqlis oder eine beliebige Anzahl von sagenhaft smart Blogger. Teufel ist natürlich zu wissen, was Sie suchen. Nein, wo haben Sie schon einmal berechnen, oder weisen Sie die Kind-id-Wert in den stream, was natürlich ist, warum wird es nicht angezeigt.
Müssen wir einfach erzeugen eine monoton steigende Nummer zurück, jedes mal wenn die Quellen-id ändert. Ich bin so eine Vermutung, dass die eingehenden ID ist einzigartig in der eingehenden Daten, wie z.B. einem Umsatz Rechnungsnummer eindeutig und wir splitten die Einzelteile gekauft. Allerdings, wenn diese IDs wurden wiederholt in das dataset, vielleicht statt der Darstellung Rechnung zahlen Sie Verkäufer id. Sales Person 1 hätte eine weitere Zeile in die batch-Gemüse zu verkaufen. Das ist ein etwas Komplexes Szenario und können wir überdenken, ob das besser beschreibt Ihre Quell-Daten.
Es gibt zwei Teile zu generieren unsere Ersatzschlüssel (wieder Probleme mit den Bremsen nach unten in kleinere Stücke). Das erste, was zu tun ist, eine Sache, die zählt von 1 bis N. Sie definiert haben, eine
childId
variable zu dienen. Initialisieren Sie diese variable (1) und erhöhen Sie es in Ihrem foreach-Schleife.Nun, dass wir zählen, müssen wir darauf drängen, dass der Wert auf den output-stream. Setzen Sie diese zwei Schritte zusammen Aussehen würde
Führen Sie das Paket und Erfolg! Kratz das generieren von künstlichen Schlüssel aus der Liste.
String Maischen
Ich weiß nicht, von ein fancy Begriff für das, was getan werden muss, um in die andere Hälfte des Problems, aber ich brauchte einen Titel für diesen Abschnitt. Angesichts der Quelle der Daten, diese könnte man schwieriger zu bekommen Recht. Sie haben geliefert Wert von Apple01, Banana01, Spoon1, Fork1. Es sieht aus wie es ein Muster gibt (Namen verknüpft, mit einem code), aber was es ist es? Dein code zeigt, dass, wenn es weniger als 3, ist es ein suffix, aber wie wollen Sie wissen, was die Basis ist? Die erste Zeile verwendet eine führende 0 und ist zwei Zeichen lang sind, während die zweite Zeile nicht mit einer führenden null. Dies ist, wo Sie brauchen, um Ihre Daten verstehen. Was ist die Regel für die Ermittlung der "code" - Teil der ersten Zeile? Einige mögliche algorithmen
Ich keine änderungen gemacht, um die generierten item-Namen über die Festsetzung der lokalen Variablen Elementname/itemList. Der endgültige code eliminiert die Warnungen durch entfernen der PosID und initialisieren txtHolder auf eine leere Zeichenfolge.
Ich kann mich nicht durchsetzen konsistenter Länge der Daten. Es scheint, dass kann ich nicht herausfiltern, der all die Besonderheiten meiner Daten, sondern nur, Sie zu reinigen, die in einem breiten Allgemeinen Muster für die zukünftige Nutzbarkeit. Nachdem die Daten bereinigt sind, Plane ich Verweise auf diese Daten mittels fuzzy lookup wie die Levenshtein-oder Jaccard-Index. Vielen Dank nochmal für Eure freundliche Hilfe. Der Ersatzschlüssel funktioniert wunderbar.
InformationsquelleAutor billinkc