SSIS-Import von CSV-Dateien mit Text-Qualifier im Text

Heute bin ich nebenbei beim Schreiben meines Buchs auf ein Problem mit SSIS gestoßen auf das ich gerne an dieser Stelle hinweisen möchte bzw. für das ich hier auch gleich eine Lösung anbieten möchte.

Gestoßen bin ich auf das Problem beim Versuch das Microsoft Translation Glossary für LightSwitch in eine SQL-Server Datenbank zu schreiben um die Übersetzungen aus der Datenbank dann über eine Visual Studio LightSwitch-Anwendung bequem abzufragen. Das Problem ist, dass das Zeichen das in der CSV-Datei (Translation Glossarys sind einfache CSV-Dateien) als Text-Qualifier verwendet wird („) auch innerhalb des Textes verwendet wird, z.B. „Bitte drücken Sie auf „“OK“““. Das Problem ist, dass sich SSIS bei einer solchen Aktion auf die Nase legt. Es wird die folgende Zeichenkette erkannt: „Bitte drücken Sie auf “ dann beschwert sich SSIS darüber dass nun kein Trennzeichen folgt – aber die Zeichenkette ist ja eigentlich noch nicht zu Ende.

Hmm – doofe Sache zumal das Problem wohl bekannt ist, aber momentan von Microsoft nicht adressiert wird (das kann man hier lesen).

Ein bisschen Stöbern im MSDN hat auch nicht den erhofften Erfolg gebracht. Alle hier vorgestellten Lösungen sind meiner Meinung nach ein wenig „Oversized“ – ich will ja nur weil die Flat-File-Source nicht mit Text-Qualifiern innerhalb des Textes klarkommt keine neue SSIS-Komponente auf meinem Server installieren oder so. Hier habe ich noch einen interessanten Artikel von Tim Laqua gefunden. Er löst das Problem mit einem Script-Task und einem regulären Ausdruck (auch interessant der Verweis auf RegexLab.NET). Die Lösung gefällt mir besser als der Rest, da man zumindest keine neue Komponente für SSIS programmieren muss. Im Prinzip lädt Tim die zu importierende ASCII-Datei in seine Script-Komponente, sucht sich mit Hilfe eines regulären Ausdrucks die Text-Qualifier raus und ersetzt diese durch ein neues Text-Qualifier-Token. Die so modifizierte Datei wird dann gespeichert und die Flat-File-Source liest die neue Datei ein und hat das ersetzte Text-Qualifier-Token dann als Text-Qualifier drinstehen. Geht natürlich auch, aber es muss eine neue Datei geschrieben werden und das mit den regulären Ausdrücken ist auch nicht immer so einfach.

Ich habe mir gedacht, dass es irgendwie noch einfacher gehen muss. Da ist mir die folgende Idee gekommen: Im Prinzip geht es ja nur um die Text-Qualifier, die den Text umschließen, d.h. wir haben etwas das wie folgt aussieht „Bitte drücken Sie auf „“OK“““. Löscht man die rot markierten Anführungszeichen hat man doch alles was man möchte. Daher funktioniert mein Ansatz wie folgt (am Beispiel der Microsoft Translation Glossarys):

Die zu importierenden Daten sehen wie folgt aus:

011914_2245_SSISImportv1

Ich habe dann einfach ein SSIS-Paket geschrieben bei dem in der CSV-Datenquelle als Feldtrennzeichen das Doppelkomma (,,) steht und kein Text-Qualifier angegeben:

011914_2245_SSISImportv2

Als Trennzeichen für die Spalten habe ich das Doppelkomma angegeben:

011914_2245_SSISImportv3

 

d.h. zunächst werden die Daten mit ihren Anführungszeichen im SSIS-Paket verarbeitet:

011914_2245_SSISImportv4

Als nächstes laufen die Daten dann in die Komponente DeleteTextQualifiers, über die die Original-Inhalte (also mit Anführungszeichen) durch abgeleitete Felder ersetzt werden.

011914_2245_SSISImportv5

Ich schneide einfach über einen Ausdruck das erste und das letzte Zeichen ab (die wie wir ja wissen Text-Qualifier sind):

011914_2245_SSISImportv6

Bei mir sind alle Spalteninhalte mit Text-Qualifiern umschlossen. Ist das bei anderen Daten nicht der Fall kann man einfach die Felder die nicht verändert werden sollen 1:1 durchreichen. Und schon kommt da das Ergebnis raus was wir haben möchten:

011914_2245_SSISImportv7

Manchmal gibt es auch einfache Lösungen… 😉

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

%d Bloggern gefällt das: