Konfigurierbare Dateisuche mit Foreach Loop

13. Dezember 2010

Wer Dateien aus einem Verzeichnis mit SSIS verarbeiten möchte, verwendet üblicherweise einen Foreach Loop Container mit einem File Enumerator und gibt das Verzeichnis und die Dateimaske an. Leider lässt sich aber hier nur eine einzige Dateimaske verwenden. Doch was tun wenn ein Verzeichnis mehrere Dateien mit unterschiedlichen Namen enthält oder mehrere Verzeichnisse berücksichtigt werden sollen? Etwa mehrere Foreach Loop Container mit jeweils der gleichen Verarbeitung?

Abhilfe schafft hier das Zusammenspiel zweier Foreach Loop Container die aus einer XML Datei gespeist werden. Und das geht so:

  1. Anlegen eines äußeren Foreach Loop Containers, nennen wir ihn FLC DirSpec.
  2. Im Scope von FLC DirSpec zwei String-Variablen anlegen, und zwar FileSpec und Directory. Diese Variablen sollen mit Werten aus einer XML-Datei gefüllt werden und an die innere Loop weitergereicht werden.
  3. Anlegen einer XML-Datei, wobei Directory und FileSpec als Attribute angegeben werden.
       1: <?xml version="1.0" encoding="utf-8" standalone="yes"?>

       2: <Directories>

       3:  

       4:     <DirSpec Directory="D:TestdirDir1" FileSpec="*.zip" />

       5:     <DirSpec Directory="D:TestdirDir1" FileSpec="*.pdf" />

       6:     <DirSpec Directory="D:TestdirDir2" FileSpec="*.bmp" />

       7:  

       8: </Directories>

  4. In der äußeren Loop FLC DirSpec den Enumerator NodeList einstellen und als EnumerationType ElementCollection auswählen. Als OuterXPathString wird mit DirectInput der Eintrag /Directories/DirSpec (siehe Struktur XML-Datei) angegeben und als InnerXPathString @* (alle Attribute) gesetzt. In Variable Mappings sollen entsprechend der Attribut-Reihenfolge in der XML-Datei die Variablen User::Directory und User::FileSpec eingetragen werden.
  5. Jetzt wird die innere Foreach Loop als FLC Filepath angelegt. Diese Loop ist vom Typ FileEnumerator und für die eigentliche Dateisuche verantwortlich. Dazu müssen im Expression Editor Directory und FileSpec auf die in Schritt 4 gefüllten User-Variablen zugeordnet werden.
  6. Anlegen einer Ergebnisvariable User::Filepath und diese eintragen in Variable Mappings bei FLC Filepath. Darin steht dann später bei Paketausführung der vollständige Pfad einer gefundenen Datei.
  7. Innerhalb von FLC Filepath kann nun die eigentliche Dateiverarbeitung platziert werden, die auf die Variable User::Filepath zugreift und für jede gefundene Datei aufgerufen wird. Das Paket sieht damit beispielsweise so aus:ForeachLoop

 

 

 

 

 

 

 

 

 

Ergebnis: Bei Paketausführung wird die XML-Datei von der äußeren Loop gelesen und das Verzeichnis und die Dateimaske jeweils an die innere Loop weitergegeben. Diese sucht dann in den realen Verzeichnissen nach entsprechenden Dateien. Für jede gefundene Datei wird die Verarbeitungsroutine aufgerufen.

Fazit: Durch die Kombination zweier Foreach Loop Container mit einer Konfigurationsdatei kann die Dateisuche sehr flexibel mit SSIS Bordmitteln verwirklicht werden. Es lassen sich auch weitere Konfigurationselemente hinzufügen um beispielsweise Rekursion bei der Dateisuche einzuschalten. Königsdisziplin ist natürlich die Entwicklung eigener Custom Components. Der Aufwand lohnt sich insbesondere wenn spezielle Anforderungen abgedeckt werden sollen und dies standardmäßig nicht ohne weiteres möglich ist.