![](/img/trans.png)
[英]Replace commas that are not within double inverted commas(“”) from csv files using 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.