Frage

Ich bin bcp mit Hilfe einer Tabelle aus einer anderen Tabelle sonst weit weg weit von jemandem exportiert aus einer CSV-Datei zu laden, und haben in einigen Fragen führen. Meine ursprünglichen zwei Probleme: ein exportierte Feld ist ein int, dass der Bedarf in einem varchar Feld, um am Ende, und ein anderes Feld Bedürfnisse mit einer statischen Zeichenfolge gefüllt werden. Nun, das erste ist keine große Sache, und Chad Antwort führte mich in der @{n='Col3';e={'ABC'}} Syntax. Aber ich bin Stolpern um einige Probleme bekommen die Daten korrekt geladen.

  1. Manchmal kann ein Wert keine Leerzeichen haben, manchmal ist es vielleicht. Wie gebe ich Begrenzungszeichen für das in einer bcp-Formatdatei? Ich frage vermutlich, weil ich diese mit Anführungszeichen müssen.

    a. Soll ich mit Zitaten Verpackung Werten in der Zwischen CSV-Datei sein?

  2. In meinem Test-Code, es schiebt die Spaltenüberschriften und einen Zeilenvorschub in Col1 mit dem aktuellen Wert von Col1 für die erste Zeile.

  3. In meinem eigentlichen, aufpoliert Code, ich bin immer String data, right truncation in der ersten Reihe, wenn die zweite Reihe in Ordnung eingefügt wird.

Wie auch immer, die ersten CSV-Daten, dass ich von woanders sieht wie folgt aus (Anmerkung: keine Kopfzeile)

"ABC123",123456,"APPLE"
"XYZ789",456789,"ORANGE"

Das Ziel SQL-Tabelle ist wie dieser

Col1 varchar(50) (Primary Key)
Col2 varchar(50)
Col3 varchar(50)
Col4 varchar(50)

Ich muss Last ABC123 in Col1, 123456 in Col2, Export1 in Col3 und APPLE in Col4. Export1 ist die statische Zeichenfolge. Ich tue dies in Powershell 1.0.

EDIT: Tschads import-csv | export-csv sieht vielversprechend aus, aber es funktioniert nicht wie Header fehlen, und PS 1.0 nicht die -Header Option unterstützen.

EDIT: Edited Beschreibung oben zu reflektieren, wie ich zu diesem Punkt irrt habe. Die Tabelle mit vier Spalten und drei Spalten CSV sind offensichtlich Vereinfachungen. Eine echte Säule ist eine Stadt, so dass es einfache Strings oder solche enthalten könnte, die unter Angabe erfordern. Mein Powershell 1.0 Code an dieser Stelle ist wie folgt.

$SQLSERVER="svr"
$SQLTABLE="test"
$SQLUSER="u"
$SQLPASS="p"

$TESTFILE = "testdata.csv"
$TESTFILEHDR = "testdata-wHeaders.csv"
$TESTFILEFIX = "testdata-fixed.csv"
$OrigHeaders = "`"Col1`",`"Col2`",`"Col3`"`n"

function Create-BcpFormat($fileName)
{
@"
<?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_AltDiction_CP850_CI_AS'/>
  <FIELD ID='2' xsi:type='CharTerm' TERMINATOR='",' COLLATION='SQL_AltDiction_CP850_CI_AS'/>
  <FIELD ID='3' xsi:type='CharTerm' TERMINATOR=',' COLLATION='SQL_AltDiction_CP850_CI_AS'/>
  <FIELD ID='4' xsi:type='CharTerm' TERMINATOR='\r\n' COLLATION='SQL_AltDiction_CP850_CI_AS'/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="Col1" xsi:type="SQLVARYCHAR"/>
  <COLUMN SOURCE="2" NAME="Col2" xsi:type="SQLVARYCHAR"/>
  <COLUMN SOURCE="3" NAME="Col3" xsi:type="SQLVARYCHAR"/>
  <COLUMN SOURCE="4" NAME="Col4" xsi:type="SQLVARYCHAR"/>
 </ROW>
</BCPFORMAT>
"@ | Set-Content $filename
}

## GHI456 is already in the table, clean out previous attempts
"`nclean test table:"
osql @("-S","$SQLSERVER","-U","$SQLUSER","-P","$SQLPASS","-Q",
    """delete from $SQLTABLE where col1 <> 'GHI456' or col1 is null""")

## Prepend
$body = [string]::join([environment]::NewLine, (gc $TESTFILE))
$OrigHeaders + $body > $TESTFILEHDR

"`nTESTFILEHDR:"
type $TESTFILEHDR

$accts = Import-csv $TESTFILEHDR | select 'Col1', 'Col2', @{n='Col3';e={'ABC'}}, @{n='Col4';e={$_.Col3}}
$accts
$accts | Export-Csv $TESTFILEFIX -NoTypeInfo

"`nTESTFILEFIX:"
type $TESTFILEFIX

$BCPFMTFILE = "bcp.fmt"
$BCPERRFILE = "bcp.err"
Create-BcpFormat $BCPFMTFILE
bcp @("$SQLTABLE","in","$TESTFILEFIX","-S","$SQLSERVER","-U","$SQLUSER","-P","$SQLPASS","-f",$BCPFMTFILE,"-e",$BCPERRFILE)
Remove-Item $BCPFMTFILE

"`ntest table:"
osql @("-S","$SQLSERVER","-U","$SQLUSER","-P","$SQLPASS","-Q",
    """select left(Col1,20) 'Col1', left(Col2,8) 'Col2', left(Col3,8) 'Col3', left(Col4,8) 'Col4' from $SQLTABLE""")

"`nBCPERRFILE:"
type $BCPERRFILE
War es hilfreich?

Lösung

Warum Sie nicht verwenden ADO.NET des SqlBulkCopy programmatisch in Powershell? Sie haben die volle Kontrolle: Lese Zeile für Zeile, convert Daten und füllen Sie eine Datentabelle, wie Sie möchten und invoke WriteToServer in den Reihen. Siehe http://msdn.microsoft.com/en -US / library / system.data.sqlclient.sqlbulkcopy.aspx

Andere Tipps

Sie könnten etwas tun um die Spalte zu addieren

import-csv \ forum.csv -Header "Col1", "Col2", "Col4." | Wählen Sie Col1, Col2, @ {n = 'Col3'; e = { 'Export1'}}, Col4 | Export-Csv ./forum2.csv -NoTypeInfo

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top