it-swarm.com.de

Wie kann das Problem mit dem eingebetteten Textqualifizierer beim Exportieren von Daten in eine CSV-Flat-Datei behoben werden?

RFC 4180:

RFC 4180 definiert Common Format and MIME Type for Comma-Separated Values (CSV) Files. Eine der Anforderungen von RFC 4180 wird unten angegeben. Dies ist der Punkt #7 in der RFC-Verbindung.

If double-quotes are used to enclose fields, then a double-quote
appearing inside a field must be escaped by preceding it with
another double quote.  For example:

"aaa","b""bb","ccc"

SQL Server 2000:

DTS Export/Import Wizard in SQL Server 2000 scheint den oben genannten Standards zu entsprechen, obwohl der RFC 4180 selbst anscheinend erst am Oktober 2005 veröffentlicht wurde. Ich verwende die unten angegebene SQL Server 2000-Version.

Microsoft SQL Server  2000 - 8.00.2039 (Intel X86) 
May  3 2005 23:18:38 
Copyright (c) 1988-2003 Microsoft Corporation
Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)

SQL Server 2012:

SQL Server Import and Export Wizard in SQL Server 2012 exportiert die Daten gemäß dem in RFC 4180 definierten Standard nicht aus der Tabelle in eine CSV-Datei. Ich verwende die unten angegebene Version SQL Server 2012.

Microsoft SQL Server 2012 - 11.0.2316.0 (X64) 
Apr  6 2012 03:20:55 
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

Problemsimulation:

Hier ist ein Beispiel, das ich sowohl in SQL Server 2000 als auch in SQL Server 2012 ausgeführt habe. Ich führte die folgende Abfrage aus, um eine Tabelle zu erstellen und einige Datensätze einzufügen. Die ItemDesc-Spalte enthält Daten mit Anführungszeichen. Ich beabsichtige, die Daten aus diesen beiden SQL Server-Versionen mit dem integrierten Exportdaten-Assistenten zu exportieren und die generierten CSV-Dateien zu vergleichen.

CREATE TABLE dbo.ItemInformation(
    ItemId nvarchar(20) NOT NULL,
    ItemDesc nvarchar(100) NOT NULL
) 
GO

INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('100338754', 'Crown Bolt 3/8"-16 x 1" Stainless-Steel Hex Bolt');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('202255836', 'Simpson Strong-Tie 5/8" SSTB Anchot Bolt');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('100171631', 'Grip-Rite #11 x 1-1/2" Electro-Galvanized Steel Roofing Nails');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('202210289', 'Crown Bolt 1/2" x 3" "Zinc-Plated" Universal Clevis Pin');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('100136988', 'Tapcon 3/16" x 1-3/4" Climaseal Steel "Flat-Head" Phillips Concrete Anchors (75-Pack)');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('203722101', 'KwikTap 3/16" x 2-1/4" "Flat-Head" Concrete Screws (100-Pack)');
GO

Bei DTS Export/Import Wizard in SQL Server 2000 habe ich die folgenden Einstellungen verwendet, um die Daten in eine CSV-Datei zu exportieren. Ich habe die Datei unter dem Namen SQLServer2000_ItemInformation.csv gespeichert.

DTS Export/Import Wizard

Bei SQL Server Import and Export Wizard in SQL Server 2012 habe ich die folgenden Einstellungen verwendet, um die Daten in eine CSV-Datei zu exportieren. Ich habe die Datei unter dem Namen SQLServer2012_ItemInformation.csv gespeichert.

SQL Server Import and Export Wizard - Choose a destination

SQL Server Import and Export Wizard - Configure Flat File Destination

Hier ist der Vergleich der beiden Dateien mit Beyond Compare. Die linke Seite enthält die von SQL Server 2000 erzeugte Datei und die rechte Seite enthält die von SQL Server 2012 erzeugte Datei. Sie können feststellen, dass die linke Seitendatei von SQL Server 2000 zusätzliche Anführungszeichen enthält, um die eingebetteten Anführungszeichen in der Datenspalte zu kompensieren. Dies entspricht dem in RFC 4180 angegebenen Standard, fehlt aber eindeutig in der von SQL Server 2012 erzeugten Datei.

File Comparison

Sucht im Web:

Ich habe im Web nach diesem Fehler gesucht und folgende Links gefunden. Im Folgenden finden Sie die Fehlerberichte zu Microsoft Connect. All diese Probleme scheinen mit dem Import einer Datei zu tun zu haben, aber nichts mit dem Export von Daten. Alle diese Fehler wurden als Fixed geschlossen.

Der folgende Beitrag in einem MSDN-Blog gibt an, dass Änderungen in SQL Server 2012 in Bezug auf Flat file source supports embedded qualifiers and a variable number of columns per row vorgenommen wurden.

Ein anderer Beitrag in einem MSDN-Blog besagt dasselbe im Abschnitt Embedded Qualifiers.

Problemumgehung, die ich kenne:

Ich kenne eine Problemumgehung, um das Problem zu beheben, indem ich eine Abfrage schreibe, die alle Anführungszeichen (") in meinen Spaltendaten durch zwei Anführungszeichen ("") ersetzt, sodass die exportierte Datei am Ende endet mit den richtigen eingebetteten Qualifier-Daten. Dies würde verhindern, dass die Daten so wie sie sind direkt aus der Tabelle gezogen werden.

Meine Fragen:

  • Ich weiß nicht, ob dieses Problem in SQL Server 2012 wirklich behoben wurde. Wurde dieses Problem nur für importing -Dateien mit eingebetteten Textqualifikationsmerkmalen und not für exporting-Daten in CSV behoben?

  • Wahrscheinlich mache ich eindeutig etwas falsches und verpasse das Offensichtliche. Könnte mir bitte jemand erklären, was ich hier falsch mache?

Microsoft Connect:

Ich habe einen Fehlerbericht auf der Microsoft Connect-Website eingereicht, um deren Feedback zu erhalten. Hier ist der Link zum Fehlerbericht. Wenn Sie einverstanden sind, dass dies ein Fehler ist, besuchen Sie bitte den folgenden Link, um auf der Microsoft Connect-Website zu stimmen.

Eingebettetes Textqualifikationsmerkmal während des Exports nach CSV entspricht nicht RFC 4180

61
user756519

Ich würde diese Antwort nicht anbieten, es sei denn, Sie haben so hart gearbeitet, um sie zu dokumentieren, und sie wurde nach einem Monat ohne Antwort bestätigt. Also hier gehts. Ihre einzige Wahl scheint zu sein, die Daten oder das Werkzeug zu ändern. 

Wahrscheinlich mache ich eindeutig etwas falsches und verpasse das Offensichtliche. Könnte mir bitte jemand erklären, was ich hier falsch mache?

Wenn das Tool defekt ist und der Hersteller sich nicht darum kümmert, ist es ein Fehler, es weiter zu versuchen. Es ist Zeit zu wechseln. Sie haben sich sehr viel Mühe gegeben, genau zu untersuchen, wie es kaputt ist, und zeigen, dass es nicht nur den RFC, sondern auch die frühere Version des Tools verletzt. Wie viel mehr Beweise brauchen Sie? 

CSV ist auch ein Bootsanker. Wenn Sie die Option haben, sollten Sie ein normales Dateiformat mit Trennzeichen verwenden. Für viele Anwendungen ist Tabulatorzeichen gut. Das beste Trennzeichen im IMO ist '\', da dieses Zeichen keinen Platz im englischen Text hat. (Andererseits funktioniert es nicht für Daten, die Windows-Pfadnamen enthalten.)

CSV hat zwei Probleme als Austauschformat. Erstens ist es nicht alles dieser Standard; Verschiedene Anwendungen erkennen unterschiedliche Versionen, wie auch immer der RFC sagen mag. Zweitens (und verwandt) ist, dass es keine reguläre Sprache in CS-Begriffen darstellt, weshalb es nicht als regulärer Ausdruck analysiert werden kann. Vergleichen Sie mit ^([^\t]*\t)*[\t]*$ für eine durch Tabulatoren getrennte Zeile. Die praktische Auswirkung der Komplexität der Definition von CSV ist (siehe oben) der relative Mangel an Werkzeugen für deren Umgang und ihre Tendenz, insbesondere während der kleinen Stunden inkompatibel zu sein. 

Wenn Sie CSV und DTS den Startvorgang geben, haben Sie gute Optionen. Eine davon ist bcp.exe. Es ist sehr schnell und sicher, da Microsoft seit Jahren nicht mehr versucht wurde, es zu aktualisieren. Ich weiß nicht viel über DTS, aber für den Fall, dass Sie es für die Automatisierung verwenden müssen, gibt es eine Möglichkeit, externe Dienstprogramme aufzurufen. Beachten Sie jedoch, dass bcp.exe den Fehlerstatus nicht zuverlässig an die Shell zurückgibt. 

Wenn Sie sich entschlossen haben, DTS zu verwenden und bei CSV zu bleiben, besteht Ihre beste verbleibende Option darin, eine Ansicht zu schreiben, in der die Daten entsprechend vorbereitet werden. Wenn ich in diese Ecke zurückversetzt würde, würde ich ein Schema erstellen, das "DTS2012CSV" heißt, so dass ich select * from DTS2012CSV.tablename schreiben könnte, damit jeder, der Interesse hat, die Chance hat, es zu verstehen. in Kommentaren im Ansichtstext?). Bei Bedarf können andere ihre Technik für andere gebrochene Auszüge kopieren. 

HTH. 

7
James K. Lowden

Ich weiß, dass dies zwei Jahre alt ist, aber ich habe jetzt auch dieses Problem, da wir SQL Server 2008 für einen Vertrag verwenden müssen, den wir haben (nicht fragen). Nachdem ich diese Frage durchgelesen hatte, wurde mir klar, dass ich den Ersetzungsvorschlag machen musste, aber als ich in der Abfrage dazu kam, bin ich auf Probleme mit der Verkürzung gestoßen, weil die Funktion replace () in der Abfrage selbst den Text in eine varchar (8000) standardmäßig.

Ich entdeckte jedoch, dass ich das Gleiche tun könnte, indem zwischen den Objekten DB Source und Flat File ein Schritt Abgeleitete Spalte verwendet wird. Ich habe zum Beispiel eine Spalte namens "short_description", die Anführungszeichen enthalten könnte. Deshalb habe ich nur die folgende Funktion als Ausdruck verwendet und in der abgeleiteten Spalte "Ersetzen short_description" ausgewählt:

REPLACE(short_description,"\"","\"\"")

Dies scheint das Problem für mich gelöst zu haben.

1
skywarpgold

Oft stehen der Vor- und Nachname im selben Feld und sind formatiert (Last, First). Dies muss textqualifiziert sein, wenn Sie Tasks-> Export Data direkt aus der Datenbank verwenden (nicht über SSIS, wo Sie mehr Optionen haben) und als CSV-Datei in CSV exportieren müssen.

Dies wird in den von Ihnen ausgewählten Feldern helfen, die doppelte Anführungszeichen benötigen ...

CASE WHEN NOT PersonName IS NULL AND LEN(PersonName) > 0 THEN QUOTENAME(PersonName, '"') ELSE NULL END as 'PersonName'

Ergebnis:

Name der Person

"COLLINS, ZACKERY E"

0
Greg Bologna