我有一个逗号分隔的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
答案 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- 分离 {{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