繁体   English   中英

PowerShell脚本将双引号内的逗号替换为空

[英]PowerShell script to replace commas within double quotes with nothing

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

编者按:本题形式要求“将[the]分隔符改为竖线”( | ),不再要求; 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

导入 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

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

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

以下应该做你想做的(在 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]实例),其属性包含删除双引号的列值。

    • 由于列的值然后被存储在不同的特性,列-内部,实例可以因此盲目地更换,而无需担心列-分离,实例。
    • 自动去除封闭的双引号是一个有益的副作用,但必须注意不要在输出中重新引入它们 - 请继续阅读。
  • 问题是您不能在修改对象后使用Export-Csv ,因为它总是在所有输出值周围添加双引号(后退)。

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

    • -Begin { $writeHeader = $True }在开始时执行一次,以表示需要在第一个数据行之前输出标题行。

    • $_.psobject.properties是输入对象上定义的所有属性的集合,以标题列命名,并包含给定数据行的值。

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

    • $_.psobject.properties.Value -replace ',', ''删除任何内部值,实例(用空字符串替换它们),并且-join ','再次将结果值按原样与, ,输出一个数据行。

  • Set-Content - 这里比Out-File更可取,因为输出对象已经是字符串- 用于写入输出文件。

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

    • Windows PowerShell (版本高达 v5.1)中,不使用-Encoding将默认为您系统的“ANSI”代码页(即使帮助主题声称使用 ASCII),而Out-File将默认为 UTF-16LE(“Unicode” )。

你的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM