CiAgICA8IS0tIExpbmtlZEluIC0tPgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAgIF9saW5rZWRpbl9wYXJ0bmVyX2lkID0gIjEyMzUwNzMiOwogICAgICAgIHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyA9IHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyB8fCBbXTsKICAgICAgICB3aW5kb3cuX2xpbmtlZGluX2RhdGFfcGFydG5lcl9pZHMucHVzaChfbGlua2VkaW5fcGFydG5lcl9pZCk7CiAgICA8L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgICAgKGZ1bmN0aW9uKCl7dmFyIHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IilbMF07CiAgICAgICAgICAgIHZhciBiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgICAgIGIudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiO2IuYXN5bmMgPSB0cnVlOwogICAgICAgICAgICBiLnNyYyA9ICJodHRwczovL3NuYXAubGljZG4uY29tL2xpLmxtcy1hbmFseXRpY3MvaW5zaWdodC5taW4uanMiOwogICAgICAgICAgICBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsIHMpO30pKCk7CiAgICA8L3NjcmlwdD4KICAgIDxub3NjcmlwdD4KICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBhbHQ9IiIgc3JjPSJodHRwczovL3B4LmFkcy5saW5rZWRpbi5jb20vY29sbGVjdC8/cGlkPTEyMzUwNzMmZm10PWdpZiIgLz4KICAgIDwvbm9zY3JpcHQ+CiAgICA8IS0tIEVuZCBMaW5rZWRJbiAtLT4KICAgIA==
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Unsaubere Textdateien importieren

Dies ist zwar nur ein kurzer Blogbeitrag, aber er wird all denen, die sich bereits damit geplagt haben, un-saubere Textdateien mit SQL Server Integration Services (SSIS) zu importieren, eine einfache Lösung lie-fern. Das Problem ist uralt: SSIS kann bis einschließlich Release 2008R2 keine Textdateien mit Trennzei-chen importieren, deren Inhalt nicht zu 100% der vorab gespeicherten Spezifikation entspricht. “Unsau-ber” bedeutet hierbei konkret, dass einzelne Datensätze weniger Spalten enthalten als spezifiziert, d.h. das Zeilentrennzeichen (z.B. CarriageReturn/LineFeed, CR/LF bei typischen Windows-Flatfiles) taucht vor dem letzten erwarteten Spaltentrennzeichen (z.B. Komma oder Semikolon) auf.

Textdatei sauber:
Datum;Kunde;Produkt;Umsatz;Absatz
01.05.2012;4711;P1;1000;200
02.05.2012;4712;P2;100;15
03.05.2012;4713;P3;10;3

Textdatei unvollständig:
Datum;Kunde;Produkt;Umsatz;Absatz
01.05.2012;4711;P1;1000;200
02.05.2012;4712;P2;100
03.05.2012;4713;P3;;3

Diese Situation tritt bei vielen häufig verwendeten Datenquellen auf, u.a. beim Export aus diversen SAP-Modulen unter Verwendung der Standardeinstellungen. Damit kann SSIS überraschenderweise nicht feh-lerfrei umgehen und liefert stattdessen versionsabhängig entweder Fehlermeldungen („Das Spaltentrenn-zeichen für die wurde nicht gefunden“) oder – noch schlimmer – falsche Ergebnisse (der komplette nächs-te Datensatz wird in die letzte Spalte angehängt).

Ergebnis korrektAbb. 1: Ergebnis korrekt

Ergebnis falschAbb. 2: Ergebnis falsch

Die Problematik ist weithin bekannt, einschlägige Web-Foren sind voller Frust und Hohn, doch eine Lö-sung seitens Microsoft existiert erst für SQL Server 2012. Für alle, die mit früheren Versionen arbeiten, bleiben Empfehlungen zu Workarounds, die hohen manuellen Aufwand nach sich ziehen, beispielsweise die Verwendung von (Zwischen-)Skripten oder den zeilenweisen Import unter Missachtung des tatsächli-chen Spaltentrennzeichens und die nachträgliche Zerlegung mittels SQL.

Bei der Vorbereitung einer Kundendatendemo stieß ich bei wiederholter Webrecherche auf das Schlag-wort “Delimited File Reader”. Es handelt sich hierbei um ein Add-In für SSIS, das bei der Codeplex-Community kostenlos zum Download bereitsteht, einfach zu installieren und zu bedienen ist und nach meinen Erfahrungen fehlerfrei und performant arbeitet.

Installation und Verwendung sind simpel: MSI-Paket ausführen und anschließend in BI Development Stu-dio per Rechtsklick in der Toolbox auf “Elemente auswählen” das neue SSIS-Datenflusselement “Delimited File Reader” aktivieren, woraufhin es neben den bekannten Quellen (Flatfile, OLE-DB, Excel etc.) er-scheint.

DelimitedFileReader aktivierenAbb. 3: DelimitedFileReader aktivieren

Datenflussquelle verwendenAbb. 4: Datenflussquelle verwenden

Anschließend erstellt man zunächst wie gewohnt einen Verbindungsmanager vom Typ “Flatfile”. Nun kommt der einzige Unterschied zur gewohnten Vorgehensweise: Anstelle einer Datenquelle vom Typ “Flatfile” verwendet man den neuen “Delimited File Reader”. Diesem vererbt man den gewünschten Ver-bindungsmanager.

Verbindungsmanager auswählenAbb. 5: Verbindungsmanager auswählen

Ein Doppelklick auf die Datenquelle führt zu der Meldung, dass kein graphischer Editor für die Komponen-te existiert; Detailmodifikationen müssen also bei Bedarf mit dem erweiterten Editor aus dem Kontext-menü durchgeführt werden, doch war das nach meinen bisherigen Erfahrungen gar nicht erforderlich, denn die automatischen Voreinstellungen führen zum gewünschten Importergebnis:

Ergebnis besserAbb. 6: Ergebnis besser

In diesem Sinn – Happy Importing!