Kontakt  Impressum 
 
       Navigationslinks überspringen.   

SSIS: Komplexe Dateiselektion ForEach-Schleifencontainer

Der häufigste Anwendungsfall für einen ForEach-Schleifencontainer ist das vollständige Auflisten von Dateien in einem Verzeichnis. Die aufgelisteten Dateien werden anschließend meist weiterverarbeitet. Die Selektionsmöglichkeiten im ForEach-Schleifencontainer sind allerdings begrenzt:

Paketvariablen

Man kann :
- den Ordner angeben
- Unterordner bei der Suche mit einbeziehen
- Dateien unter Berücksichtigung von Wildcards selektieren

Weitere Details zur ForEach-Schleifencontainer finden Sie in der Microsoft Onlinehilfe:

Es ist aber nicht möglich, die Dateiauswahl darüber hinaus einzuschränken. Sollen nur Dateien ab einem bestimmten Änderungsdatum eingelesen werden oder sowohl CSV-Dateien als auch TXT-Dateien, dann muss der ForEach-Schleifencontainer erstmal passen.

Dieses Problem kann man lösen, indem eine Dateiselektion dem ForEach-Schleifencontainer vorgeschaltet wird und die selektierten Dateinamen in einem DataTable an den ForEach-Schleifencontainer übergeben werden. Für die Übergabe wird eine Objektvariable verwendet, die mittels des ForEach-ADO-Enumerators eingelesen wird.
Das hört sich vielleicht etwas kompliziert an, aber intern macht der ForEach-Container eigentlich nichts anders.
  1. Legen Sie zwei Paketvariablen an:


  2. Paketvariablen


  3. Bauen Sie folgenden Workflow in der Ablaufsteuerung auf:


  4. Workflow


  5. In der vorgeschalteten Skripttask referenzieren sie in der Eigenschaft ReadWriteVariables auf die Variable DataTable.
  6. Im Skript geben Sie folgenden Programmcode ein:

  7. Imports System
    Imports System.IO
    Imports System.Data
    
    Public Class ScriptMain
    
       Public Sub Main()
         Dim DT As New DataTable
         Dim DR As DataRow
         Dim DC As New DataColumn("File", GetType(String))
         DT.Columns.Add(DC)
    
         Dim i As Int32
         Dim ArrFiles() As String = Directory.GetFiles("c:\aus", "*.zip")
    
         For i = 0 To ArrFiles.Length - 1
              DR = DT.NewRow
              DR("File") = ArrFiles(i)
              DT.Rows.Add(DR)
         Next
    
         ArrFiles = Directory.GetFiles("c:\aus", "*.xls")
    
         For i = 0 To ArrFiles.Length - 1
              DR = DT.NewRow
              DR("File") = ArrFiles(i)
              DT.Rows.Add(DR)
         Next
    
         Dts.Variables("DataTable").Value = DT
    
         Dts.TaskResult = Dts.Results.Success
       End Sub
    
    End Class
    
    Zusätzlich müssen Sie im Projektexplorer einen Verweis auf die System.XML hinzufügen. Dies ist notwendig, um in der obigen Form auf DataSets und DataTable zugreifen zu können.
    Im obigen Beispiel werden alle *.zip und *.xls-Dateien im Verzeichnis C:\aus aufgelistet. Das Dateiverzeichns und die Dateiselektion können Sie natürlich entsprechend Ihren Anforderungen anpassen.
    Es ist möglich, beliebig komplexe Selektionen zu programmieren. Die gefundenen Dateien werden in einer DataTable (DT) gespeichert.
    Dieses DataTable (DT) wird zum Abschluss an die Objektvariable DataTable übergeben:
    Dts.Variables("DataTable").Value = DT
  8. Im Foreach-Schleifencontainer darf jetzt natürlich  nicht mehr direkt über das Dateiverzeichnis iteriert werden. Der Input wird ja über das vorselektierte DataTable zur Verfügung gestellt. So wird als Enumerator der Foreach-ADO-Enumerator ausgewählt. Die ADO-Objektquellvariable ist unsere Benutzer-Variable <DataTable>:


  9. ForEach-Schleifen-Editor

  10. Nun müssen Sie noch die Variablenzuordnung durchführen:

    Der Index ist Null-basierend. Die Spalten der DataTable werden aufsteigend hochgezählt. Da wir nur eine Spalte verwenden, hat diese Spalte den Index 0.
    Im Beispielpaket wird abschließend die Variable File mit einer Skripttask in einer Messagebox angezeigt.

    Das vollständige Beispielpaket steht auch zum Download bereit:

Berthold Neumann
02. Juni. 2006

Letzte Änderung: 2.November. 2007 
As a craftsman's replica watches in the Rolex brand, the Rolex Sea-made replica watches online is water-resistant to 4,000 feet, while the brand deep-deep watch is waterproof to 12,800 feet. The waterproof rating of the replica watches uk shows the extraordinary results of working with professional divers for decades uk replica watches.