PowerShell脚本用什么代替双引号内的逗号
我有一个逗号分隔的CSV文件,在那里我打算装在双引号没有逗号,也什么也没有替换双引号:PowerShell脚本用什么代替双引号内的逗号
编者按 :本原始形式这个问题提出的“改变定界符管[该]”(|
),这是不再要求; 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是否有头?值是否在同一列中更改?
如果它看起来是这样的:
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
我将其分为两个步骤。另一个*用户可能会给你一个单行的。
Import-Csv C:\test.csv | Export-Csv tempfile.csv -Delimiter "|"
(Get-Content tempfile.csv).Replace(",","").Replace('"',"") | Out-File test1.csv
@ mklement0我相信这是必需的,但OP已经在代码中完成了这部分。原来的问题指定了分隔符从','更改为'|'......我将它放在那里,因为我认为最好一次完成,反对像OP一样遍历文件。 – gms0ulman
我明白了;无论最终目的是什么,++都是一种聪明的方法(由于读写文件两次,速度会很慢,但是否重要取决于用例)。除非你担心PSv2的兼容性,否则你可以用'Get-Content -Raw'加快速度;相反,如果文件太大而无法一次装入内存,请在'ForEach'调用中执行'.Replace'调用。 更好的是,如果您使用'ConvertTo-Csv -NotypeInformation',则可以避免中间文件,如在培根位的答案中。 – mklement0
以下应做你想做的(在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
参数用于控制输出字符编码 - 根据需要进行调整。不使用
-Encoding
将默认为系统的“ANSI”代码页(即使帮助主题声明为ASCII),而Out-File
将默认为UTF-16LE(“Unicode”)。
导入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
请允许我给你的标准建议新人:如果答案解决您的问题,请通过点击大的复选标记(✓)接受它旁边以及可选赞成票它(最多投票需要至少15点声望点)。 如果您发现其他答案有帮助,请投票给他们。接受(为此你将获得2点声望点)和增加投票有助于未来的读者。请参阅[相关帮助中心文章](http://*.com/help/someone-answers)。 – mklement0