web 2.0

SSIS: CSV-Dateien mit Textbegrenzungszeichen innerhalb des Textes importieren

Damit man Sonderzeichen innerhalb der Daten einer CSV-Datei nutzen kann, gibt es Textbegrenzungszeichen (engl.: text qualifier). Soll dieses Begrenzerzeichen in den Daten vorkommen, so wird dieses einfach verdoppelt (maskiert). Nachfolgend eine Beispieldatei mit dem “ als Textbegrenzungszeichen:

1|"John Doe"|17.01.1946
2|"Dwayne ""The Rock"" Johnson"|02.05.1972
3|"Steve ""Stone Cold"" Austin"|18.12.1964
4|"Randy ""Macho Man"" Savage"|15.11.1952
5|"Hulk Hogan"|11.10.1953
6|"Mark "The Undertaker" Calaway"|24.03.1965

Fügt man einen Verbindungsmanger für die CSV-Datei hinzu und wählt das doppelte Anführungszeichen(“)als “Text qualifier” aus

1 Flat File Connection Manager Editor

dann kommt es beim Wechsel auf Columns zu folgender Fehlermeldung:

2 Error

Ignoriert man diese Meldung und führt das Paket trotzdem aus, schlägt dieses fehl mit der Meldung:

[SSIS.Pipeline] Error: SSIS-Fehlercode 'DTS_E_PRIMEOUTPUTFAILED'. Die PrimeOutput-Methode in 'Komponente 'Flatfilequelle' (1)' hat den Fehlercode 0xC0202092 zurückgegeben. Die Komponente gab einen Fehlercode zurück, als das Pipelinemodul 'PrimeOutput()' aufgerufen hat. Die Bedeutung des Fehlercodes wird von der Komponente definiert. Der Fehler ist jedoch schwerwiegend, und die Ausführung der Pipeline wurde beendet. Möglicherweise wurden bereits Fehlermeldungen veröffentlicht, die weitere Fehlerinformationen beinhalten.

Damit ist klar, SSIS unterstütz keine Textbegrenzungszeichen innerhalb eines Datenfeldes (zumindest bis einschließlich der Version für SQL Server 2008).

Wichtig: Als Workaround zeige ich jetzt einen kleinen Trick, der allerdings nur hilft, wenn das Spaltentrennzeichen nicht im Text vorkommt.

Als erstes entfernt man das Textbegrenzungszeichen  im Verbindungsmanager für die CSV-Datei. Würde man dann die Daten in eine Datenbank importieren, würde man dieses Ergebnis sehen:

3 unerwuenschtes Ergebnis

Hier sind jetzt natürlich eine Menge Anführungszeichen zu sehen. Innerhalb des Textes kommen diese auch doppelt vor, was so nicht beabsichtigt ist. Deshalb führt man im Datenflusstask eine Abgeleitete Spalte (engl.: derived column) hinzu. Damit kann man die Daten in der Spalte mit diversen Funktionen bearbeiten.

4 Datenfluss

Zuvor benötigt man noch zwei Variablen, auf die ich gleich noch einmal zurückkomme.

5 Variablen

Jetzt ist alles vorbereitet und man kann den Transformationstask “Abgeleitete Spalte” bearbeiten. Dort wird unter Derived Column die zu bearbeitende Spalte ausgewählt und bei Expression folgender Wert eingegeben:

REPLACE(SUBSTRING([Column 1],2,LEN([Column 1]) - 2),@[User::q1],@[User::q2])

Im Prinzip wird hier nur der String am Anfang und Ende beschnitten (die Anführungszeichen entfernt) und doppelte Vorkommen durch ein Anführungszeichen ersetzt.

Das Ganze sieht dann so aus:

6 Derived Column Transformation Editor

Führt man jetzt das Paket aus, erscheint folgendes Ergebnis:

7 Ergebnis

Die Anführungszeichen am Anfang und Ende sind verschwunden und innerhalb des Textes kommen diese nur noch einfach vor.

Hinweis: Anscheinend kommt es nur bei Dateien im Unicode-Format zu diesen Fehler. Bei einem Test mit einer ANSI-Datei lief alles fehlerlos.

Tags:

SSIS | Datenbanken

Add comment




  Country flag
biuquote
  • Comment
  • Preview
Loading