Parsing Non-Standard Text File Formats with the Script Component
Jeśli Twój urządzenie źródłowe dane są rozmieszczone w niestandardowym formacie, może się okazać, że wygodniejszy konsolidować wszystkie analizy logikę w jednym skrypcie niż aby łańcuch wielu Integration Services Transformacje, aby osiągnąć ten sam wynik.
Przykład 1: Podczas analizy tekstu rozdzielanego wiersz rekordy
Przykład 2: Dzielenie nadrzędne i podrzędność rekordy
Uwaga
Jeśli chcesz utworzyć składnik, który można łatwiej ponownie używać wielu zadań przepływ danych i wielu pakietów, należy rozważyć przy użyciu kodu w tym przykładzie składnika skryptów jako punktu wyjścia dla składnika przepływ danych niestandardowych.Aby uzyskać więcej informacji zobaczRozwijanie niestandardowy składnik przepływ danych.
Przykład 1: Podczas analizy tekstu rozdzielanego wiersz rekordy
W tym przykładzie pokazano, jak plik tekstowy, w którym każdej kolumnie danych pojawia się w osobnym wierszu i analizować je w obiekt docelowy tabela za pomocą składnika skryptów.
Aby uzyskać więcej informacji dotyczących sposobu konfigurowania składnika skryptów do użycia jako transformacja w przepływ danych zobacz Tworzenie synchroniczne transformacja składnika skryptów i Tworzenie transformacja asynchroniczny przy użyciu składnika skryptów.
Aby skonfigurować w tym przykładzie składnik skryptów
Tworzenie i zapisywanie pliku tekstowego o nazwie rowdelimiteddata.txt , który zawiera następujące dane źródłowe:
FirstName: Nancy LastName: Davolio Title: Sales Representative City: Seattle StateProvince: WA FirstName: Andrew LastName: Fuller Title: Vice President, Sales City: Tacoma StateProvince: WA FirstName: Steven LastName: Buchanan Title: Sales Manager City: London StateProvince:Otwórz Management Studio i połączyć się z wystąpienie SQL Server.
Wybierz obiekt docelowy bazy danych i otworzyć nowe okno kwerendy.W oknie kwerendy, uruchom następujący skrypt, aby utworzyć obiekt docelowy tabeli:
create table RowDelimitedData ( FirstName varchar(32), LastName varchar(32), Title varchar(32), City varchar(32), StateProvince varchar(32) )Otwórz BI Development Studio i Utwórz nowy Integration Services pakiet o nazwie ParseRowDelim.dtsx.
Dodawanie plik prosty menedżer połączeń do pakiet, nadaj mu nazwę RowDelimitedData i skonfigurować go, aby połączyć się z plikiem rowdelimiteddata.txt utworzonego w poprzednim kroku.
Dodać do pakiet menedżer połączeń OLE DB i skonfigurować go do łączenia się z wystąpienie SQL Server i bazy danych, w którym został utworzony w tabela docelowej.
Dodawanie zadanie przepływu danych do pakiet, a następnie kliknij przycisk Przepływ danych kartę SSIS projektanta.
Dodawanie urządzenie źródłowe plik prosty do przepływ danych i jest skonfigurowana do używania RowDelimitedData menedżer połączeń.Na kolumna stronaplik prosty Edytor urządzenie źródłowe, zaznacz jedną kolumna zewnętrzną dostępne.
Dodawanie składnika skryptów do przepływ danych i skonfigurować go jako transformacja.Dane wyjściowe urządzenie źródłowe plik prosty połączyć się z składnik skryptów.
Kliknij dwukrotnie składnik skryptów, aby wyświetlić Skrypt transformacja edytora.
Na kolumna danych wejściowych stronaSkrypt transformacja edytora, należy zaznaczyć jedną kolumna danych wejściowych dostępnych.
Na Wejść i wyjść stronaSkrypt transformacja edytora, zaznacz opcję Wyjście 0 i zestaw jego SynchronousInputID na 0. Tworzenie 5 kolumn wyjściowych, wszystkie typu [DT_STR] ciąg o długości 32:
FirstName
LastName
Title
Miasto
StateProvince
Na Skrypt stronaSkrypt transformacja edytora, click Edytowanie skryptu i wprowadź kod ScriptMain Klasa w przykładzie. Zamknij środowiska programistycznego skryptu, Skrypt transformacja edytora.
Dodawanie obiekt docelowy serwera SQL do przepływ danych.Jest skonfigurowana do używania menedżer połączeń OLE DB i tabela RowDelimitedData.Dane wyjściowe skryptu składnika połączyć się z tego obiekt docelowy.
Należy uruchomić pakiet.Po zakończeniu pracy tego pakiet, należy zbadać rekordów w SQL Server obiekt docelowy tabeli.
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
Dim columnName As String
Dim columnValue As String
' Check for an empty row.
If Row.Column0.Trim.Length > 0 Then
columnName = Row.Column0.Substring(0, Row.Column0.IndexOf(":"))
' Check for an empty value after the colon.
If Row.Column0.Substring(Row.Column0.IndexOf(":")).TrimEnd.Length > 1 Then
' Extract the column value from after the colon and space.
columnValue = Row.Column0.Substring(Row.Column0.IndexOf(":") + 2)
Select Case columnName
Case "FirstName"
' The FirstName value indicates a new record.
Me.Output0Buffer.AddRow()
Me.Output0Buffer.FirstName = columnValue
Case "LastName"
Me.Output0Buffer.LastName = columnValue
Case "Title"
Me.Output0Buffer.Title = columnValue
Case "City"
Me.Output0Buffer.City = columnValue
Case "StateProvince"
Me.Output0Buffer.StateProvince = columnValue
End Select
End If
End If
End Sub
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
string columnName;
string columnValue;
// Check for an empty row.
if (Row.Column0.Trim().Length > 0)
{
columnName = Row.Column0.Substring(0, Row.Column0.IndexOf(":"));
// Check for an empty value after the colon.
if (Row.Column0.Substring(Row.Column0.IndexOf(":")).TrimEnd().Length > 1)
// Extract the column value from after the colon and space.
{
columnValue = Row.Column0.Substring(Row.Column0.IndexOf(":") + 2);
switch (columnName)
{
case "FirstName":
// The FirstName value indicates a new record.
this.Output0Buffer.AddRow();
this.Output0Buffer.FirstName = columnValue;
break;
case "LastName":
this.Output0Buffer.LastName = columnValue;
break;
case "Title":
this.Output0Buffer.Title = columnValue;
break;
case "City":
this.Output0Buffer.City = columnValue;
break;
case "StateProvince":
this.Output0Buffer.StateProvince = columnValue;
break;
}
}
}
}
Przykład 2: Dzielenie nadrzędne i podrzędność rekordy
W tym przykładzie pokazano, jak plik tekstowy, w którym wiersz separatora poprzedza wiersz rekordu nadrzędnego, który następuje na dowolną liczbę wierszy rekordów podrzędność, i analizować je do poprawnie znormalizowana nadrzędne i podrzędność obiekt docelowy tabel za pomocą składnika skryptów.W tym przykładzie prosty łatwo mogą być dostosowane do urządzenie źródłowe pliki, używające więcej niż jeden wiersz lub kolumna dla każdego rekordu nadrzędne i podrzędność, tak długo, jak jest jakiś sposób zidentyfikować początek i koniec każdego rekordu.
Ostrzeżenie
W tym przykładzie jest przeznaczona wyłącznie w celach demonstracyjnych.Po uruchomieniu próbki więcej niż jeden raz, wstawia zduplikowane wartości kluczy w obiekt docelowy tabela.
Aby uzyskać więcej informacji dotyczących sposobu konfigurowania składnika skryptów do użycia jako transformacja w przepływ danych zobacz Tworzenie synchroniczne transformacja składnika skryptów i Tworzenie transformacja asynchroniczny przy użyciu składnika skryptów.
Aby skonfigurować w tym przykładzie składnik skryptów
- Tworzenie i zapisywanie pliku tekstowego o nazwie parentchilddata.txt , który zawiera następujące urządzenie źródłowe danych:
******** PARENT 1 DATA child 1 data child 2 data child 3 data child 4 data ******** PARENT 2 DATA child 5 data child 6 data child 7 data child 8 data ********
Otwórz SQL Server Management Studio i połączyć się z wystąpienie SQL Server.
Wybierz obiekt docelowy bazy danych i otworzyć nowe okno kwerendy.W oknie kwerendy, uruchom następujący skrypt, aby utworzyć obiekt docelowy tabel:
CREATE TABLE [dbo].[Parents]( [ParentID] [int] NOT NULL, [ParentRecord] [varchar](32) NOT NULL, CONSTRAINT [PK_Parents] PRIMARY KEY CLUSTERED ([ParentID] ASC) ) GO CREATE TABLE [dbo].[Children]( [ChildID] [int] NOT NULL, [ParentID] [int] NOT NULL, [ChildRecord] [varchar](32) NOT NULL, CONSTRAINT [PK_Children] PRIMARY KEY CLUSTERED ([ChildID] ASC) ) GO ALTER TABLE [dbo].[Children] ADD CONSTRAINT [FK_Children_Parents] FOREIGN KEY([ParentID]) REFERENCES [dbo].[Parents] ([ParentID])Otwórz Business Intelligence Development Studio i Utwórz nowy Integration Services pakiet o nazwie SplitParentChild.dtsx.
Dodawanie plik prosty menedżer połączeń do pakiet, nadaj mu nazwę ParentChildData i skonfigurować go, aby połączyć się z plikiem parentchilddata.txt utworzonego w poprzednim kroku.
Dodać do pakiet menedżer połączeń OLE DB i skonfigurować go do łączenia się z wystąpienie SQL Server a bazą danych, w którym został utworzony obiekt docelowy tabel.
Dodawanie zadanie przepływu danych do pakiet, a następnie kliknij przycisk Przepływ danych kartę SSIS projektanta.
Dodaj płaski plikowe urządzenie źródłowe dla przepływ danych i jest skonfigurowana do używania ParentChildData menedżer połączeń.Na kolumna stronaplik prosty Edytor urządzenie źródłowe, zaznacz jedną kolumna zewnętrzną dostępne.
Dodawanie składnika skryptów do przepływ danych i skonfigurować go jako transformacja.Dane wyjściowe urządzenie źródłowe plik prosty połączyć się z składnik skryptów.
Kliknij dwukrotnie składnik skryptów, aby wyświetlić Skrypt transformacja edytora.
Na kolumna danych wejściowych stronaSkrypt transformacja edytora, należy zaznaczyć jedną kolumna danych wejściowych dostępnych.
Na Wejść i wyjść stronaSkrypt transformacja edytora, zaznacz opcję Wyjście 0, zmień jego nazwę na ParentRecords, i zestaw jego SynchronousInputID Brak. Utwórz 2 kolumny wyjściowe:
ParentID (klucz podstawowy), typ 4 bajtowy całkowita [DT_I4]
ParentRecord typu [DT_STR] ciąg o długości 32.
Utwórz drugą danych wyjściowych i nadaj mu nazwę ChildRecords.The SynchronousInputID of the new output is already zestaw to None. Utwórz 3 kolumny wyjściowe:
ChildID (klucz podstawowy), typ 4 bajtowy całkowita [DT_I4]
ParentID (klucz obcy), również czwartego bajtu typu całkowita [DT_I4]
ChildRecord typu [DT_STR] ciąg o długości 50
Na Skrypt stronaSkrypt transformacja edytora, click Edytowanie skryptu.W ScriptMain klasy, należy wprowadzić kod przedstawiony w przykładzie. Zamknij środowiska programistycznego skryptu, Skrypt transformacja edytora.
Dodawanie obiekt docelowy serwera SQL do przepływ danych.Dane wyjściowe ParentRecords składnika skryptów połączyć się z tym obiekt docelowy.Configure go do używania menedżer połączeń OLE DB i tabela elementów nadrzędnych.
Dodawanie innego programu SQL Server obiekt docelowy do przepływ danych.Dane wyjściowe ChildRecords składnika skryptów połączyć się z tego obiekt docelowy.Jest skonfigurowana do używania menedżer połączeń OLE DB i w tabela elementy podrzędne.
Należy uruchomić pakiet.Po zakończeniu pracy pakiet zbadać rekordy nadrzędne i podrzędność na obu SQL Server obiekt docelowy tabel.
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
Static nextRowIsParent As Boolean = False
Static parentCounter As Integer = 0
Static childCounter As Integer = 0
' If current row starts with separator characters,
' then following row contains new parent record.
If Row.Column0.StartsWith("***") Then
nextRowIsParent = True
Else
If nextRowIsParent Then
' Current row contains parent record.
parentCounter += 1
Me.ParentRecordsBuffer.AddRow()
Me.ParentRecordsBuffer.ParentID = parentCounter
Me.ParentRecordsBuffer.ParentRecord = Row.Column0
nextRowIsParent = False
Else
' Current row contains child record.
childCounter += 1
Me.ChildRecordsBuffer.AddRow()
Me.ChildRecordsBuffer.ChildID = childCounter
Me.ChildRecordsBuffer.ParentID = parentCounter
Me.ChildRecordsBuffer.ChildRecord = Row.Column0
End If
End If
End Sub
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
int static_Input0_ProcessInputRow_childCounter = 0;
int static_Input0_ProcessInputRow_parentCounter = 0;
bool static_Input0_ProcessInputRow_nextRowIsParent = false;
// If current row starts with separator characters,
// then following row contains new parent record.
if (Row.Column0.StartsWith("***"))
{
static_Input0_ProcessInputRow_nextRowIsParent = true;
}
else
{
if (static_Input0_ProcessInputRow_nextRowIsParent)
{
// Current row contains parent record.
static_Input0_ProcessInputRow_parentCounter += 1;
this.ParentRecordsBuffer.AddRow();
this.ParentRecordsBuffer.ParentID = static_Input0_ProcessInputRow_parentCounter;
this.ParentRecordsBuffer.ParentRecord = Row.Column0;
static_Input0_ProcessInputRow_nextRowIsParent = false;
}
else
{
// Current row contains child record.
static_Input0_ProcessInputRow_childCounter += 1;
this.ChildRecordsBuffer.AddRow();
this.ChildRecordsBuffer.ChildID = static_Input0_ProcessInputRow_childCounter;
this.ChildRecordsBuffer.ParentID = static_Input0_ProcessInputRow_parentCounter;
this.ChildRecordsBuffer.ChildRecord = Row.Column0;
}
}
}
|
Konfiguracja w aktualizacji z usług integracja Services pobytu