Benutzer mit den meisten Antworten
CSV mittels OleDb einlesen: Delimiter ändern

Frage
-
Hallo,
Habe ein Script welches mir CSV-Files mittels OleDb einließt.
Die CSV-Files haben standardmäßig einen semikolon (;) als Delimiter. Auf meinen lokalen Rechner unter WinXP geht das auch ohne Probleme,
allerdings muß das Script auf einen Server (OS:WinServer2008 R2) laufen, und hier hab ich das Problem, dass dieser nur normale Kommas als Trennzeichen erkennt. Fehler gibts zwar keinen, eingelesen wird aber immer nur die erste Spalte des CSV-Files.
Mein Frage also: kann man den Delimiter für OleDb irgendwie ändern bzw. festlegen? oder muss ich da anders vorgehen?
Hier mein Code:
$connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=`"$filepath`";Extended Properties=`"text;HDR=Yes;FMT=Delimited`";" $qry = "Select * From $csv" $conn = new-object System.Data.OleDb.OleDbConnection($connString) $conn.open() $cmd = new-object System.Data.OleDb.OleDbCommand($qry,$conn) $da = new-object System.Data.OleDb.OleDbDataAdapter($cmd) $dt = new-object System.Data.dataTable [void]$da.fill($dt) $conn.close()
Die ACE.OLEDB.12.0 liefert mir das gleiche Ergebnis.
Gruß speedy
- Bearbeitet speedcar343 Donnerstag, 19. Juli 2012 11:04
Antworten
-
Ok Problem gelöst.
Da Import-Csv unter ANSI-Codierung keine Umlaute mag, musste ich vorerst eine neue UTF8-tempcsv erstellen.
Hier der Code:Import-Module "$env:windir\system32\WindowsPowerShell\v1.0\Modules\ImportFunctions.psm1" GC $csv | Out-File -Encoding UTF8 "$env:windir\temp\utf8csv.csv" $csvutf8 = Import-Csv "$env:windir\temp\utf8csv.csv" -Delimiter ";" $DataTable = Out-DataTable -InputObject $csvutf8 Write-DataTable -ServerInstance $s -Database $d -TableName $t -Data $DataTable
Da ich noch in den PowerShell-Kinderschuhen stecke, wäre ich über Verbesserungsvorschläge sehr erfreut :-)
Diese Funktionen hab ich in die psm1 gespeichert:
Out-DataTable --> http://gallery.technet.microsoft.com/scriptcenter/4208a159-a52e-4b99-83d4-8048468d29dd
Write-DataTable --> http://gallery.technet.microsoft.com/scriptcenter/2fdeaf8d-b164-411c-9483-99413d6053ae
Gruß speedy- Bearbeitet speedcar343 Freitag, 20. Juli 2012 08:47
- Als Antwort markiert speedcar343 Freitag, 20. Juli 2012 08:51
Alle Antworten
-
Ich weiss zwar nicht warum du bei PowerShell nicht einfach Import-CSV nimmst und dann die Objekte in die Datenbank pumpst!?
Aber bei OleDB kann man im Connection string keinen Delimiter angeben.
Dort muss man eine Datei Schema.ini anlegen!
Suchmaschine: OleDB CSV Delimiter
http://stackoverflow.com/questions/3109360/how-to-specify-the-delimiter-when-importing-csv-files-via-oledb-in-c-sharpPlease click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' ' -
Einfach erklärt wieso: Anfangs benötigte ich ein Script welches mir Excel einließt und in die DB importiert, dies funkt mittels OleDb wunderbar, auch auf 2008R2.
Diese Lösung macht genau das was ich wollte, und mit ein paar Veränderungen hab ich das dann für csv angepasst, funkt auch super, nur eben nicht unter Win2008R2 (wegen den doofen Delimiter).
Das Script möchte ich allerdings so einfach wie möglich halten (sprich ohne Schema.ini), daher werde ich es wohl lieber mit Import-Csv probieren. -
Ok Problem gelöst.
Da Import-Csv unter ANSI-Codierung keine Umlaute mag, musste ich vorerst eine neue UTF8-tempcsv erstellen.
Hier der Code:Import-Module "$env:windir\system32\WindowsPowerShell\v1.0\Modules\ImportFunctions.psm1" GC $csv | Out-File -Encoding UTF8 "$env:windir\temp\utf8csv.csv" $csvutf8 = Import-Csv "$env:windir\temp\utf8csv.csv" -Delimiter ";" $DataTable = Out-DataTable -InputObject $csvutf8 Write-DataTable -ServerInstance $s -Database $d -TableName $t -Data $DataTable
Da ich noch in den PowerShell-Kinderschuhen stecke, wäre ich über Verbesserungsvorschläge sehr erfreut :-)
Diese Funktionen hab ich in die psm1 gespeichert:
Out-DataTable --> http://gallery.technet.microsoft.com/scriptcenter/4208a159-a52e-4b99-83d4-8048468d29dd
Write-DataTable --> http://gallery.technet.microsoft.com/scriptcenter/2fdeaf8d-b164-411c-9483-99413d6053ae
Gruß speedy- Bearbeitet speedcar343 Freitag, 20. Juli 2012 08:47
- Als Antwort markiert speedcar343 Freitag, 20. Juli 2012 08:51
-
Ja, leider unterstützt Import-CSV keinen -Encoding Parameter. Das war mir neu!
Statt Out-File kann man auch Set-Content oder einfach nur den Umleitungsoperator > benutzen, der erzeugt immer Unicode Dateien.
Die Datatable Cmdlets sind auch sehr nützlich!
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
- Bearbeitet Peter Kriegel Freitag, 20. Juli 2012 09:22
-
Der Umleitungs Operator > oder >> (zum anhängen an eine Datei) ist aus dem DOS und UNIX Terminals übernommen worden.
Und ist mit daran schuld das die PowerShell Syntax so kompliziert geworden ist.
Ich empfehle dir das Buch vom "erfinder" der PowerShell sprache Bruce Payette PowerShell in Action second Edition.
Oder du wartest bis die zweite ausgabe ins deutsche übersetzt wird. SEHR GUT !!!!!!
Umleitungsoperatoren Mit den Umleitungsoperatoren (>, >>, 2>, 2> und 2>&1) senden Sie die Ausgabe eines Befehls oder Ausdrucks an eine Textdatei. Die Umleitungsoperatoren werden wie das Cmdlet "Out-File" (ohne Parameter) verwendet, doch können Sie auch die Fehlerausgabe in angegebene Dateien umleiten. Sie können auch das Cmdlet "Tee-Object" verwenden, um Ausgaben umzuleiten.Weitere Informationen finden Sie unter
Get-Help about_Redirection
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '