Wie bulk insert aus CSV -, wenn einige Felder haben neue-Zeile-Zeichen?
Ich habe einen CSV-dump von einem anderen DB sieht wie folgt aus (id, name, Notizen):
1001,John Smith,15 Main Street
1002,Jane Smith,"2010 Rockliffe Dr.
Pleasantville, IL
USA"
1003,Bill Karr,2820 West Ave.
Dem letzten Feld kann enthalten Zeilenumbrüche und Kommas, in welchem Fall es ist umgeben von doppelten Anführungszeichen. Und ich brauche zu bewahren gibt und Kommas.
Ich benutze diesen code zum importieren von CSV-Dateien in meine Tabelle:
BULK INSERT CSVTest
FROM 'c:\csvfile.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
SQL Server 2005 bulk insert nicht herausfinden, dass Zeilenumbrüche innerhalb von Anführungszeichen sind keine terminatoren.
Wie überwinden?
UPDATE:
Sieht aus wie der einzige Weg, um Zeilenumbrüche innerhalb eines Feldes ist die Verwendung von verschiedenen row-separator. Also, ich möchte markieren Sie alle Zeilen-Trennung Zeilenumbrüche, indem Sie ein Rohr vor Ihnen. Wie kann ich die CSV so aussieht?
1001,John Smith,15 Main Street|
1002,Jane Smith,"2010 Rockliffe Dr.
Pleasantville, IL
USA"|
1003,Bill Karr,2820 West Ave.|
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bulk-Operationen auf SQL-Server nicht explizit Unterstützung für CSV, obwohl Sie importieren können Sie, wenn Sie die Dateien sorgfältig formatiert. Mein Vorschlag wäre zu umschließen, alle Feld-Werte in Anführungszeichen gesetzt werden. BULK INSERT könnte, dann lassen Sie die Zeilenumbrüche innerhalb eines Feldes Wert. Wenn nicht, dann Ihre nächste Lösung wäre ein Integration Services-Paket.
Sehen Vorbereiten von Daten für den Massenexport oder-Import für mehr.
können Sie massage diese Zeilenumbrüche in eine Zeile mit einem Drehbuch, zB können Sie verwenden, GNU sed zu entfernen Zeilenumbrüche. zB
dann können Sie bulk insert.
Edit:
Speichern :
/"/!s/$/|/;/.*\".*[^"]$/{ :a;N };/"$/{ s/$/|/}
in eine Datei , sagenmyformat.sed
. dann machen Sie diese auf der Befehlszeilec:\test> sed.exe -f myformat.sed myfile
2010|Rockliffe Dr|Pleasantville|IL USA
? wenn nicht, sollten Sie wahrscheinlich zeigen Sie Ihre gewünschte Leistung in Ihrer FrageKönnen Sie nicht importieren wenn Sie die CSV ist im gültigen format. Also, Sie haben entweder fix den dump manuell oder per suchen & ersetzen, beheben Sie die unerwünschte neue-Zeile-Zeichen.
Laut der Quelle allen Wissens (Wikipedia), csv verwendet neue Linien zum trennen von Datensätzen. Also, was Sie haben, ist nicht gültig csv.
Mein Vorschlag ist, dass Sie schreiben, ein perl-Programm, um Ihre Datei, und fügen Sie jeden Eintrag in der db.
Wenn Sie nicht gerade ein perl-person, dann könnte man eine Programmierung Website oder zu sehen, ob eine Art SO person schreiben die parsing-Teil des Programms für Sie.
Hinzugefügt:
Mögliche Lösung
Seit der OP erklärt, dass er es kann, ändern Sie die input-Datei, würde ich alle ändern, die neuen Linien, die nicht Folgen einer " zu sein, einen reservierten char-Sequenz, wie zB XXX
Dies kann ein automatisierter Austausch in vielen Editoren. In Windows, UltraEdit enthält regexp-suchen/ersetzen-Funktionalität
Importieren Sie dann in das dbms, denn du wirst nicht mehr die eingebettete neue Zeilen.
Dann verwenden Sie den SQL Ersetzen zu ändern XXX Vorkommnisse wieder in neue Linien.
Wenn Sie die Kontrolle haben über den Inhalt der CSV-Datei, die Sie ersetzen könnte, die im-Feld Zeilenumbrüche (
CRLF
) mit einem nicht-Zeilenumbruch-Zeichen (vielleicht auch nurCR
oderLF
), dann führen Sie ein Skript nach dem import zu ersetzen mitCRLF
wieder.Dies ist, wie MS Office Produkte (Excel, Access) mit diesem problem umzugehen.
OK, hier ein kleines Java-Programm, dass ich am Ende schreiben, um das problem zu lösen.
Kommentare, Korrekturen und Optimierungen sind willkommen.