我已经为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/

10-13 07:51