Analizowanie pliku tekstowego niestandardowych formatach składnik skryptów
Podczas swojego źródło dane są rozmieszczone w niestandardowym formacie, użytkownik może wygodniejszym konsolidować wszystkie analizy logikę w pojedynczym skrypcie niż aby łańcuch wiele Integration Services przekształcenia, aby osiągnąć ten sam wynik.
Przykład 1: Podczas analizowania rozdzielanym wierszu rekordów
Przykład 2: Dzielenie nadrzędne i podrzędne rekordy
Ostrzeżenie
Aby utworzyć składnik, który można łatwiej ponownie użyć wielu zadań przepływ danych i wiele pakietów, należy rozważyć przy użyciu kodu w tym przykładzie składnik skryptów jako punktu wyjścia dla niestandardowego składnik przepływ danych.Aby uzyskać więcej informacji, zobacz Opracowywanie danych niestandardowy składnik przepływu.
Przykład 1: Podczas analizowania rozdzielanym wierszu rekordów
W tym przykładzie pokazano, jak plik tekstowy, w którym każda kolumna danych jest wyświetlany w osobnym wierszu i analizować je na obiekt docelowy tabela za pomocą składnika skryptów.
Aby uzyskać więcej informacji dotyczących sposobu konfigurowania składnika skryptów do użytku jako transformacja w przepływ danych, zobacz Tworzenie synchroniczne transformacji przy użyciu składnik skryptów i Tworzenie asynchronicznego transformacji przy użyciu składnik skryptów.
Aby skonfigurować w tym przykładzie składnik skryptów
Utwórz i Zapisz plik tekstowy o nazwie rowdelimiteddata.txt zawiera następujące źródło danych:
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 Kwerenda wykonać następujący skrypt, aby utworzyć tabela docelową:
create table RowDelimitedData ( FirstName varchar(32), LastName varchar(32), Title varchar(32), City varchar(32), StateProvince varchar(32) )
Otwórz BI Development Studio i utworzyć nowy Integration Services pakiet o nazwie ParseRowDelim.dtsx.
Dodawanie pliku prostego menedżer połączeń do pakiet, nadaj mu nazwę RowDelimitedData i skonfigurować go do łączenia 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órej utworzono obiekt docelowy tabela.
Dodać zadanie przepływu danych do pakiet, a następnie kliknij przycisk Przepływ danych kartę SSIS projektanta.
Dodać płaski źródło pliku do przepływ danych i skonfigurować go do używania menedżer połączeń RowDelimitedData.Na kolumna strona Płaski Edytor źródła pliku, zaznacz pojedynczy zewnętrzny kolumna dostępne.
Dodaj składnik skryptów dla przepływ danych i skonfiguruj ją jako transformacja.Połączyć wyjścia płaski plik źródłowy składnik skryptów.
Kliknij dwukrotnie składnik skryptów, aby wyświetlić Script Editor transformacji.
Na Wprowadzania kolumn strona Script Editor transformacji, zaznacz pojedynczy wprowadzania kolumna dostępne.
Na wejść i wyjść strona Script Editor transformacji, zaznacz opcję Wyjście 0 i zestaw jego SynchronousInputID none.Tworzenie kolumn wyjściowych 5, wszystkie typu ciąg [DT_STR] o długości 32:
FirstName
LastName
Tytuł
Miasto
StateProvince
Na skryptu strona Script Editor transformacji, kliknij Edytowanie skryptu i wprowadź kod w ScriptMain klasy z przykładu.Zamknij środowiska programistycznego skryptu i Script Editor transformacji.
Dodaj SQL Server docelowym przepływu danych.Skonfigurować go do używania menedżer połączeń OLE DB i tabela RowDelimitedData.Połącz wyjście składnik skryptów do obiekt docelowy.
Uruchom pakiet.Po zakończeniu pakiet badanie rekordów w SQL Server obiekt docelowy tabela.
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ędne rekordy
W tym przykładzie pokazano, jak plik tekstowy, w którym wiersz rozdzielający poprzedza rekordu wiersza nadrzędnego i następuje nieskończoną liczbę wierszy rekordów podrzędność, i przeanalizować go poprawnie znormalizowana nadrzędne i podrzędność obiekt docelowy tabel za pomocą składnika skryptów.Ten prosty przykład może być łatwo dostosowana do źródło 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 sposobem identyfikowania początek i koniec każdego rekordu.
![]() |
---|
Próbka ta jest przeznaczona tylko w celach demonstracyjnych.Jeżeli próbki są uruchamiane więcej niż raz, wstawia duplikat klucz wartości w tabela docelowej. |
Aby uzyskać więcej informacji dotyczących sposobu konfigurowania składnika skryptów do użytku jako transformacja w przepływ danych, zobacz Tworzenie synchroniczne transformacji przy użyciu składnik skryptów i Tworzenie asynchronicznego transformacji przy użyciu składnik skryptów.
Aby skonfigurować w tym przykładzie składnik skryptów
- Utwórz i Zapisz plik tekstowy o nazwie parentchilddata.txt zawiera następujące źródło 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 Kwerenda wykonać następujący skrypt w celu utworzenia tabel docelowych:
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 utworzyć nowy Integration Services pakiet o nazwie SplitParentChild.dtsx.
Dodawanie pliku prostego menedżer połączeń do pakiet, nadaj mu nazwę ParentChildData i skonfigurować go do łączenia 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 i bazy danych, w której utworzono obiekt docelowy tabele.
Dodać zadanie przepływu danych do pakiet, a następnie kliknij przycisk Przepływ danych kartę SSIS projektanta.
Dodać płaski źródło pliku do przepływ danych i skonfigurować go do używania menedżer połączeń ParentChildData.Na kolumna strona Płaski Edytor źródła pliku, zaznacz pojedynczy zewnętrzny kolumna dostępne.
Dodaj składnik skryptów dla przepływ danych i skonfiguruj ją jako transformacja.Połączyć wyjścia płaski plik źródłowy składnik skryptów.
Kliknij dwukrotnie składnik skryptów, aby wyświetlić Script Editor transformacji.
Na Wprowadzania kolumn strona Script Editor transformacji, zaznacz pojedynczy wprowadzania kolumna dostępne.
Na wejść i wyjść strona Script Editor transformacji, zaznacz opcję Wyjście 0, zmień jego nazwę na ParentRecords, i zestaw jego SynchronousInputID none.Tworzenie kolumn wyjściowych 2:
ParentID (klucz podstawowy), typ 4 bajtowy całkowita [DT_I4]
ParentRecord typu ciąg [DT_STR] o długości 32.
Tworzenie drugiego wyjścia i nadaj mu nazwę ChildRecords.SynchronousInputID Nowych danych wyjściowych jest już zestaw None.Tworzenie kolumn wyjściowych 3:
ChildID (klucz podstawowy), typ 4 bajtowy całkowita [DT_I4]
ParentID (klucz obcy), również typu byte czterech całkowita [DT_I4]
ChildRecord typu ciąg [DT_STR] o długości 50
Na skryptu strona Script Editor transformacji, kliknij Edytowanie skryptu.W ScriptMain klasy, należy wprowadzić kod pokazano na przykładzie.Zamknij środowiska programistycznego skryptu i Script Editor transformacji.
Dodaj SQL Server docelowym przepływu danych.Połącz wyjście ParentRecords składnika skryptów do obiekt docelowy.Skonfigurować go do używania menedżer połączeń OLE DB i tabela rodziców.
Dodać kolejne SQL Server docelowym przepływu danych.Połącz wyjście ChildRecords składnika skryptów do obiekt docelowy.Skonfigurować go do używania menedżer połączeń OLE DB i tabela dzieci.
Uruchom pakiet.Po zakończeniu pakiet zbadać rekordy nadrzędne i podrzędność w dwóch SQL Server obiekt docelowy tabele.
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;
}
}
}
|