2016-03-21 8 views
1

Ich habe eine Software für unser System T & A aktualisiert, das eine CSV-Datei im tabulatorgetrennten Format erzeugt. Die Lohnbuchhaltungssoftware benötigt dies in dem älteren Format, das durch Semikolon getrennt ist. Ich habe mit beiden Anbietern in Kontakt gestanden und keiner hat die Möglichkeit, den anderen anzupassen. Daher muss ich die CSV-Datei an die Lohnbuchhaltungssoftware anpassen. Ich habe versucht, dies mit PowerShell mit gemischten Ergebnissen zu tun.Tabulatortrennzeichen in Semikolon umwandeln

Zuerst versuchte ich

Import-Csv ".\desktop\new version.csv" -Delimiter `t | 
    Export-Csv ".\converted.csv" -NoTypeInf 

, die die Registerkarte Trennzeichen entfernt, aber die ; nicht tun. Also versuchte ich dann

Import-Csv ".\desktop\new version.csv" -Delimiter `t | 
    Export-Csv ".\desktop\converted.csv" -NoTypeInformation -Delimiter ";" 

, die es taten konvertieren von zu ; Tabbed, aber nur für den Header. Es ignorierte den Rest der Daten vollständig. Ich habe dann versucht, einen anderen Ansatz und verwendet

$path = ".\desktop\new.csv" 
$outPath = ".\desktop\converted.csv" 
Get-Content -path $path | 
    ForEach-Object {$_ -replace "`t",";" } | 
    Out-File -filepath $outPath 

die die Datei korrekt formatiert, sondern stellen eine zusätzliche leere Zeile zwischen jeder Zeile von Daten. Ich bin mir nicht sicher, was ich falsch mache!

+1

Ihr zweiter Befehl sollte gut funktionieren, wenn Ihr Eingabe-TSV nicht fehlerhaft ist. –

Antwort

0

Hier ist eine Funktion, die ich verwendet, um Zeichenfolgen in Textdateien zu ersetzen, wie Sie es tun. Dies setzt voraus, dass in der Textdatei keine anderen Register als die Spalten vorhanden sind, die die Spalten begrenzen. Ich nehme an, dass es nicht ist. Sie können es wie folgt verwenden:

3

Ich bin ziemlich sicher, dass Sie ein Codierungsproblem mit Ihrem letzten Beispiel haben. Get-Content wird als Ascii eingelesen, während Out-File standardmäßig Unicode ist. Stellen Sie entweder -Encoding auf Out-File ein oder verwenden Sie einfach Set-Content.

Get-Content -path $path | 
ForEach-Object {$_ -replace "`t",";" } | 
Set-Content -filepath $outPath 

Sie könnten dies sogar etwas reduzieren, wenn es sein muss.

(Get-Content -path $path) -replace "`t",";" | Set-Content -filepath $outPath 

jedoch Ihr zweites Codebeispiel ...

Import-Csv ".\desktop\new version.csv" -Delimiter `t | Export-Csv ".\desktop\converted.csv" -NoTypeInformation -Delimiter ";" 

sollte gut die Registerkarten Semikolons ersetzt gearbeitet haben. Wenn es nicht funktioniert, würde ich denken, dass Ihre Quelldaten ein Problem haben.


Über die Quelldatei

Basierend auf Kommentare der Code über eine hintere Spalte erstellt. Der wahrscheinlichste Grund dafür sind nachlaufende Registerkarten in jeder Zeile, die konvertiert werden. Wenn dies der Fall ist, wäre ein wenig mehr Manipulation erforderlich. Einfachere Verwendung der foreach Schleife in diesem Fall.

Get-Content -path $path | 
ForEach-Object {$_.Trim() -replace "`t",";" } | 
Set-Content -filepath $outPath 

Das würde die letzte Registerkarte/Whitespace jeder Zeile entfernen. Es gibt ein Potenzial enorme Einschränkung tun es so zwar. Ich denke, es hat das Potenzial, Daten zu löschen, wenn Sie am Ende leere Spalten haben. Wenn diese Spalten jedoch bereits leer waren, sollte es keine Rolle spielen, solange der Header gut gebildet ist und das Eingabeprogramm dies berücksichtigen kann.Sonst sehen Sie in der Datei mit Import-CSV lesen und die letzte Spalte löschen, die getan werden kann.

+0

Hallo und danke für die Vorschläge, ich habe diese müde und sie funktionieren, aber wieder eine zusätzliche Reihe von leeren Daten hinzufügen, so ich vermute, die ursprüngliche CSV-Datei hat einige Formatierungs-/Datenprobleme. – SimonH

+0

@SimonH Gibt es in Ihren Quelldaten eine nachgestellte Registerkarte? – Matt

+0

Es muss sein, aber ich kann nicht herausfinden, wo! Die Software, die das CSV erzeugt, ist nicht das Beste, daher ist es sehr wahrscheinlich, dass es einen Fehler bei der Erstellung der Datei gibt. – SimonH