我已经为T&A系统更新了一个软件,该软件会产生制表符分隔格式的CSV文件。薪资软件需要使用以分号分隔的旧格式。我已经与两家供应商保持联系,但两家都没有办法容纳另一家,因此我需要转换CSV文件以适合薪资软件。我尝试使用PowerShell将结果混合在一起。
首先我尝试
Import-Csv ".\desktop\new version.csv" -Delimiter `t |
Export-Csv ".\converted.csv" -NoTypeInf
删除了制表符分隔符,但没有执行
;
。所以我尝试了Import-Csv ".\desktop\new version.csv" -Delimiter `t |
Export-Csv ".\desktop\converted.csv" -NoTypeInformation -Delimiter ";"
确实将其从选项卡式转换为
;
,但仅用于 header 。它完全忽略了其余数据。然后我尝试了另一种方法并使用了$path = ".\desktop\new.csv"
$outPath = ".\desktop\converted.csv"
Get-Content -path $path |
ForEach-Object {$_ -replace "`t",";" } |
Out-File -filepath $outPath
正确格式化了文件,但是在每行数据之间放置了一个多余的空行。我不确定自己在做什么错!
最佳答案
我很确定您的上一个示例存在编码问题。 Get-Content
读为Ascii,而Out-File
默认为Unicode。在-Encoding
上设置Out-File
或仅使用Set-Content
。
Get-Content -path $path |
ForEach-Object {$_ -replace "`t",";" } |
Set-Content -filepath $outPath
如果需要,您甚至可以减少一点。
(Get-Content -path $path) -replace "`t",";" | Set-Content -filepath $outPath
但是您的第二个代码示例...
应该可以很好地将选项卡替换为分号。如果它不起作用,那么我认为您的源数据有问题。
关于源文件
根据注释,以上代码将创建尾随列。最可能的原因是正在转换的每一行上的尾随制表符。如果是这种情况,那么将需要更多的操作。在这种情况下,更易于使用
foreach
循环。Get-Content -path $path |
ForEach-Object {$_.Trim() -replace "`t",";" } |
Set-Content -filepath $outPath
这将删除每行的最后一个制表符/空格。虽然这样做有潜在的巨大警告。我认为如果最后有空列,则有可能删除数据。但是,如果这些列已经为空,那么只要头文件格式正确且输入程序可以解决这个问题就无关紧要。另外,您正在看的是使用
Import-CSV
读取文件并删除最后一列可以完成的操作。关于csv - 将制表符分隔符转换为分号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36132288/