2017-02-16 5 views
-1

Ich arbeite mit einer durch Trennzeichen getrennten CSV-Datei, in der einige der Datensätze in einer der Spalten Zeilenumbrüche enthalten, weil sie extrahiert wurden.SSMS - CSV-Datei in Tabelle einlesen

Beispiel:

Jane|Ward|3  |1   |1  |0  |0  |||3210007  
Sam|Anderson|4  |1   |1  |0  |0  |||3210008  
Andy|Smithson |1  |1   |0  |0  |0  || 

|   
Henry|Johnson  |1  |1   |1  |0  |1  |Elementary School||900196 
Mary|Smith  |2  |1   |1  |0  |0  |||97 Ford 
Chris|Jones  |3  |1   |1  |0  |0  |||900341  
Allen|Bender |1  |33fg5  |asdd3 |0  |0  || 

|   
Amy|Peterson|3  |1   |1  |0  |0  |||3210007  

Die Aufzeichnungen alle 10 Spalten, also jeweils 9 Rohren. In diesem Beispiel haben die Aufzeichnungen von Andy Smithson und Allen Bender in der 9. Spalte einen Wagenrücklauf. Wenn Datensätze einen Wagenrücklauf haben, befinden sie sich immer in der 9. Spalte.

Ich habe herausgefunden, wie man die Datensätze "bereinigt" mit Regex in Notepad ++, aber ich arbeite mit einer Datei, die fast 70k Zeilen hat, also möchte ich versuchen, dies zu automatisieren so viel wie möglich, offensichtlich.

Gibt es eine Möglichkeit, eine solche Datei irgendwie in eine Tabelle einzulesen?

Ich würde dies in Versionen von SSMS 2008 und später tun.

[Bearbeiten] Ich habe dies im SSMS-Import-Assistenten versucht. Es wird nicht so funktionieren, da jede Zeile mit CRLF endet (wie in Notepad ++ gezeigt), so dass der Wizard nicht unterscheiden kann, wenn die Zeilen mit einer CRLF in dem Datensatz bleiben oder tatsächlich das Ende eines Datensatzes sind.

+0

Hast du auch diese Google? –

+0

@ rory.ap - Ja. Wenn Sie mich auf eine Seite verweisen können, die mir helfen kann, tun Sie es bitte! – marky

+0

Schauen Sie in den Befehl BULK INSERT. – EMUEVIL

Antwort

0

Ihre beste Wette ist es, eine Formatdatei zu verwenden, damit es nicht früh am RowTerminator bricht und weiter bis zum FieldTerminator.

eine XML-Format-Datei Beispiel für Ihre Daten würde wie folgt aussehen:

<?xml version="1.0"?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <RECORD> 
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="5" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="6" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="7" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="8" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="9" xsi:type="CharTerm" TERMINATOR= '|' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="10" xsi:type="CharTerm" TERMINATOR='\r\n' COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    </RECORD> 
    <ROW> 
    <COLUMN SOURCE="1" NAME="Firstname" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="2" NAME="Lastname" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="3" NAME="Column3" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="4" NAME="Column4" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="5" NAME="Column5" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="6" NAME="Column6" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="7" NAME="Column7" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="8" NAME="Column8" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="9" NAME="Column9" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="10" NAME="Column10" xsi:type="SQLVARYCHAR"/> 
    </ROW> 
</BCPFORMAT> 

und es wie folgt verwendet werden:

bcp

bcp testdb.dbo.target_table IN D:\BCP\bulk_import_file.txt -f D:\BCP\format_file.xml -T 

Hinweis verwendet: die Pfaddatei Für die folgenden zwei Optionen muss auf den SQL-Server zugegriffen werden können.

bulk insert

bulk insert dbo.target_table 
    from '...\bulk_import_file.txt' 
    with (
    formatfile = '...\format_file.xml' 
    , firstrow = 1 -- set to 2 if it has headers 
    --, lastrow = /* if you need to skip extra lines at the end */ 
    , maxerrors = 0 
    , tablock 
); 

Verwendung openrowset Verwendung:

select * 
from openrowset (
    bulk '...\bulk_import_file.txt' 
    , formatfile = '...\format_file.xml' 
    , firstrow = 1 -- set to 2 if it has headers 
    --, lastrow = /* if you need to skip extra lines at the end */ 
    , maxerrors = 0 
) as o;