スクリプト コンポーネントを使用した標準以外のテキスト ファイル形式の解析

更新 : 2006 年 7 月 17 日

ソース データが標準以外の形式の場合、複数の Integration Services 変換を連結するより、すべての解析ロジックを単一のスクリプトに統合する方がより便利で、同じ結果が得られる場合があります。

例 1 : 行区切りのレコードの解析

例 2 : 親レコードと子レコードの分割

ms345160.note(ja-jp,SQL.90).gifメモ :
複数のデータ フロー タスクおよび複数のパッケージでより簡単に再利用できるコンポーネントを作成する場合は、このスクリプト コンポーネント サンプルのコードを基にした、カスタム データ フロー コンポーネントの作成を検討してください。詳細については、「カスタム データ フロー コンポーネントの開発」を参照してください。

例 1 : 行区切りのレコードの解析

この例では、データの各列が個別の行に表示されるテキスト ファイルを取得し、スクリプト コンポーネントを使用して解析し、変換先テーブルに入れる方法を示します。

スクリプト コンポーネントをデータ フローで変換として使用するための構成方法の詳細については、「スクリプト コンポーネントによる同期変換の作成」および「スクリプト コンポーネントによる非同期変換の作成」を参照してください。

このスクリプト コンポーネントの例を構成するには

  1. 次のソース データを含む、rowdelimiteddata.txt という名前のテキスト ファイルを作成して保存します。

    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:
    
  2. Management Studio を開き、SQL Server 2005 のインスタンスに接続します。

  3. 変換先データベースを選択し、新しいクエリ ウィンドウを開きます。クエリ ウィンドウで、次のスクリプトを実行して変換先テーブルを作成します。

    create table RowDelimitedData
    (
    FirstName varchar(32),
    LastName varchar(32),
    Title varchar(32),
    City varchar(32),
    StateProvince varchar(32)
    )
    
  4. BI Development Studio を開き、ParseRowDelim.dtsx という名前の新しい Integration Services パッケージを作成します。

  5. フラット ファイル接続マネージャをパッケージに追加し、RowDelimitedData という名前を付け、前の手順で作成した rowdelimiteddata.txt ファイルに接続するように構成します。

  6. OLE DB 接続マネージャをパッケージに追加し、SQL Server のインスタンスと、変換先テーブルを作成したデータベースに接続するように構成します。

  7. データ フロー タスクをパッケージに追加し、SSIS デザイナの [データ フロー] タブをクリックします。

  8. フラット ファイル ソースをデータ フローに追加し、RowDelimitedData 接続マネージャを使用するように構成します。[フラット ファイル ソース エディタ][列] ページで、単一の使用可能な外部列を選択します。

  9. スクリプト コンポーネントをデータ フローに追加し、変換として構成します。フラット ファイル ソースの出力をスクリプト コンポーネントに接続します。

  10. スクリプト コンポーネントをダブルクリックし、[スクリプト変換エディタ] を表示します。

  11. [スクリプト変換エディタ][入力列] ページで、単一の使用可能な入力列を選択します。

  12. [スクリプト変換エディタ][入力および出力] ページで、出力 0 を選択し、SynchronousInputID を 0 に設定します。次の 5 つの出力列を、すべて文字列型 [DT_STR]、長さ 32 で作成します。

    • FirstName
    • LastName
    • Title
    • City
    • StateProvince
  13. [スクリプト変換エディタ][スクリプト] ページで、[スクリプトのデザイン] をクリックし、例の ScriptMain クラスに示すコードを入力します。スクリプト開発環境と [スクリプト変換エディタ] を閉じます。

  14. SQL Server 変換先をデータ フローに追加します。OLE DB 接続マネージャと RowDelimitedData テーブルを使用するように構成します。スクリプト コンポーネントの出力をこの変換先に接続します。

  15. パッケージを実行します。パッケージが完成したら、SQL Server 変換先テーブル内のレコードを確認します。

    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

例 2 : 親レコードと子レコードの分割

この例では、親レコードの前に区切り行があり、親レコードの後に行数不定の子レコード行が続くテキスト ファイルを取得し、スクリプト コンポーネントを使用して解析し、適切に標準化された親変換先テーブルと子変換先テーブルに入れる方法を示します。この簡単な例は、なんらかの方法で各レコードの先頭と末尾を識別できれば、各親レコードおよび子レコードで複数の行または列を使用するソース ファイルに容易に適用できます。

ms345160.Caution(ja-jp,SQL.90).gif注意 :
このサンプルは、デモンストレーションのみを目的としています。サンプルを複数回実行すると、重複したキーの値が変換先テーブルに挿入されます。

スクリプト コンポーネントをデータ フローで変換として使用するための構成方法の詳細については、「スクリプト コンポーネントによる同期変換の作成」および「スクリプト コンポーネントによる非同期変換の作成」を参照してください。

このスクリプト コンポーネントの例を構成するには

  1. 次のソース データを含む、parentchilddata.txt という名前のテキスト ファイルを作成して保存します。

******** 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 ********

  1. SQL Server Management Studio を開き、SQL Server 2005 のインスタンスに接続します。

  2. 変換先データベースを選択し、新しいクエリ ウィンドウを開きます。クエリ ウィンドウで、次のスクリプトを実行して変換先テーブルを作成します。

    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])
    
  3. Business Intelligence Development Studio を開き、SplitParentChild.dtsx という名前の新しい Integration Services パッケージを作成します。

  4. フラット ファイル接続マネージャをパッケージに追加し、ParentChildData という名前を付け、前の手順で作成した parentchilddata.txt ファイルに接続するように構成します。

  5. OLE DB 接続マネージャをパッケージに追加し、SQL Server のインスタンスと、変換先テーブルを作成したデータベースに接続するように構成します。

  6. データ フロー タスクをパッケージに追加し、SSIS デザイナの [データ フロー] タブをクリックします。

  7. フラット ファイル ソースをデータ フローに追加し、ParentChildData 接続マネージャを使用するように構成します。[フラット ファイル ソース エディタ][列] ページで、単一の使用可能な外部列を選択します。

  8. スクリプト コンポーネントをデータ フローに追加し、変換として構成します。フラット ファイル ソースの出力をスクリプト コンポーネントに接続します。

  9. スクリプト コンポーネントをダブルクリックし、[スクリプト変換エディタ] を表示します。

  10. [スクリプト変換エディタ][入力列] ページで、単一の使用可能な入力列を選択します。

  11. [スクリプト変換エディタ][入力および出力] ページで、出力 0 を選択し、ParentRecords に名前を変更してから、SynchronousInputID を 0 に設定します。次の 2 つの出力列を作成します。

    • ParentID (主キー)、4 バイト符号付き整数型 [DT_I4]
    • ParentRecord、文字列型 [DT_STR]、長さ 32
  12. 2 つ目の出力を作成し、ChildRecords という名前を付けます。新しい出力の SynchronousInputID は既に 0 に設定されています。次の 3 つの出力列を作成します。

    • ChildID (主キー)、4 バイト符号付き整数型 [DT_I4]
    • ParentID (外部キー)、4 バイト符号付き整数型 [DT_I4]
    • ChildRecord、文字列型 [DT_STR]、長さ 50
  13. [スクリプト変換エディタ][スクリプト] ページで、[スクリプトのデザイン] をクリックします。ScriptMain クラスに、例に示すコードを入力します。スクリプト開発環境と [スクリプト変換エディタ] を閉じます。

  14. SQL Server 変換先をデータ フローに追加します。スクリプト コンポーネントの ParentRecords 出力をこの変換先に接続します。OLE DB 接続マネージャと Parents テーブルを使用するように構成します。

  15. 別の SQL Server 変換先をデータ フローに追加します。スクリプト コンポーネントの ChildRecords 出力をこの変換先に接続します。OLE DB 接続マネージャと Children テーブルを使用するように構成します。

  16. パッケージを実行します。パッケージが完成したら、2 つの SQL Server 変換先テーブル内の親レコードと子レコードを確認します。

    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

参照

概念

スクリプト コンポーネントによる同期変換の作成
スクリプト コンポーネントによる非同期変換の作成

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 7 月 17 日

変更内容 :
  • サンプル スクリプトを複数回実行すると、重複したキーが作成されるという記述を加えました。

2006 年 4 月 14 日

変更内容 :
  • コード例のインライン コメントを改善しました。