首页 > 解决方案 > 当导入的文件来自 Import-csv 时,Powershell ExportCSV 导出一个空文件

问题描述

我有一个 CSV 文件,我需要将分隔符从逗号更改为分号。我用以下命令解决了这个问题

(Import-CSV $File) | Export-Csv $File -delimiter ';' -notypeinformation

但是,当导入的 CSV 文件只包含我假设正在作为标题处理的一行时。它会删除输出文件中的这一行,并变成一个空文件。但是,当我有不止一行并且 csv 包含标题和一些数据时,导出的文件正在使用标题和数据正确执行。

我用来在脚本开头设置头文件的代码

#set csv headers
Set-Content -Path "$FolderNameCiTypeDelta" -Value "name,type,location,size"

我试过添加代码

  (Import-CSV $File -Header "name,type,location,size") | Export-Csv $File -delimiter ';' -notypeinformation 

但这只是我指定的标题的额外行。

[编辑]

我测试的 2 个 csv 文件包含以下几行

使用 import --> export 命令变为空的文件包含

name,type,location,size

使用 import --> export 命令执行我需要的文件包含

name,type,location,size
test,extra,line

标签: powershellcsv

解决方案


您可以执行以下操作:

$file = 't.txt'
$contents = Get-Content $file -totalcount 2
if ($contents.Count -gt 1) {
    (Import-Csv $file) | Export-Csv $file -Delimiter ';' -NoType
}
if ($contents.Count -eq 1) {
    $contents -replace ',',';' | Set-Content $file
}

这里的想法是读取文件的两行。如果它只包含一行,它将-replace用于修复您的分隔符。如果它有超过两行,它将使用*-Csv命令。

-replace仅当您的字段值中没有逗号时,该部分才有效。如果您的字段中确实有逗号,那么您应该在字段周围使用文本限定符(最有可能是双引号)。在这种情况下,您可以简单地使用-replace '","','";"'.


推荐阅读