PowerShell脚本用双引号替换逗号,没有任何内容

时间:2017-06-29 14:51:12

标签: powershell csv

我有一个逗号分隔的CSV文件,我打算将双引号中的逗号替换为空,并且还替换双引号:

编辑注释:此问题的原始形式要求"将[分隔符]更改为管道" (|),这不再是一项要求; gms0ulman的答案是在它仍然存在的时候写的。

$inform = Get-Content C:\test.csv
$inform | % { 
$info = $_.ToString().Replace(",","") 
$var = $info 
$var | Out-file C:\test1.csv -Append 
}

非常感谢任何帮助。

在:

1,2,"Test,ABC"

输出:

1,2,TestABC

4 个答案:

答案 0 :(得分:2)

我会将其分解为两步。另一个StackOverflow用户可能会给你一个单行。

Import-Csv C:\test.csv | Export-Csv tempfile.csv -Delimiter "|"
(Get-Content tempfile.csv).Replace(",","").Replace('"',"") | Out-File test1.csv

答案 1 :(得分:2)

以下应该做你想要的(在PSv5.1中测试):

Import-Csv C:\test.csv | ForEach-Object -Begin { $writeHeader = $True } {
  if ($writeHeader) { $writeHeader = $False; $_.psobject.properties.Name -join ',' }
  $_.psobject.properties.Value -replace ',', '' -join ','
} | Set-Content -Encoding UTF8 test1.csv
  • Import-Csv将您的CSV文件读入自定义对象([pscustomobject]个实例),其属性包含删除了双引号的列值。

    • 由于列值随后存储在不同的属性中,因此可以盲目地替换column- internal ,实例,而无需担心column- 分离 {{1实例。
    • 封闭的双引号被自动剥离是一个有益的副作用,但必须注意不要在输出上重新引入它们 - 继续阅读。
  • 问题是你可以在修改对象后使用,,因为总是在所有输出周围添加双引号(后退)值。

  • 因此,必须使用Export-Csv为每个自定义对象执行自定义迷你脚本:

    • ForEach-Object在开头执行一次,表示需要在第一个数据行之前输出标题行。

    • -Begin { $writeHeader = $True }是输入对象上定义的所有属性的集合,以标题列命名,并包含给定数据行的值。

    • $_.psobject.properties输出标题行,只需将属性名称(列标题)与$_.psobject.properties.Name -join ','连接即可生成单个输出字符串。

    • ,删除所有值内部$_.psobject.properties.Value -replace ',', ''实例(用空字符串替换它们),,再次将结果值与{{1}连接起来输出数据行。

  • -join ',' - 这里优于,,因为输出对象已经是字符串 - 用于写入输出文件。

    • 注意Set-Content参数控制输出字符编码-adjust根据需要。

    • 不使用Out-File将默认使用系统的“ANSI”代码页(即使帮助主题声明ASCII),而-Encoding默认为UTF-16LE(“Unicode”)

答案 2 :(得分:2)

你的csv有标头吗?是否要在同一列中更改值?

如果它看起来像这样:

h1,h2,h3
1,2,"Test,ABC"
3,4,"Test,DEF"

这应该有效:

$Csv = Import-Csv -path C:\MyFile.csv
$Csv.H3 | foreach {$_.Replace('"',"").Replace(",","")}

编辑: 使它工作。但基本上与mklement0的解决方案相同

$Csv = Import-Csv -path C:\MyFile.csv
$Csv | Foreach {$_.H3 = $_.H3.Replace(",","")}
$CsvObject = $Csv | Convertto-Csv -NoTypeInformation
$CsvObject.replace('"','') | 
Set-Content C:\OutFile.Csv

答案 3 :(得分:2)

导入CSV。将其转换为具有不同分隔符的CSV。替换逗号。转换分隔符。替换双引号。写出结果文件。

Import-Csv -Path C:\MyFile.csv |
    ConvertTo-Csv -Delimiter '|' | 
    ForEach-Object { $_ -replace ',',[String]::Empty } | 
    ConvertFrom-Csv -Delimiter '|' | 
    ConvertTo-Csv |
    ForEach-Object { $_ -replace -replace '"',[String]::Empty } |
    Set-Content -Path C:\MyFile_fixed.csv