PowerShell脚本用什么代替双引号内的逗号

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 
+0

请允许我给你的标准建议新人:如果答案解决您的问题,请通过点击大的复选标记(✓)接受它旁边以及可选赞成票它(最多投票需要至少15点声望点)。 如果您发现其他答案有帮助,请投票给他们。接受(为此你将获得2点声望点)和增加投票有助于未来的读者。请参阅[相关帮助中心文章](http://*.com/help/someone-answers)。 – mklement0

您的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 
+0

++;也许你只是为了可读性而做了这些工作,但请注意,使用中间变量收集memory_中的所有结果对于大文件是有问题的。您可以使用单个管道,而是一次处理一个对象。 Quibble:'$ CsvObject'是一个不幸的变量名,因为它包含一串strings_(lines)。 – mklement0

+0

好点。我对这个问题的解决方法是在创建csv文件之前尝试修复格式问题,但可能会受到数据源的限制。似乎过度依赖txt文件,csv文件等。这可能是来自cmd的宿醉。有趣的是,Import-Csv产生一个对象,但Convertto-Csv产生的字符串乍看起来似乎不符合直觉。 – Dave

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

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

@ mklement0我相信这是必需的,但OP已经在代码中完成了这部分。原来的问题指定了分隔符从','更改为'|'......我将它放在那里,因为我认为最好一次完成,反对像OP一样遍历文件。 – gms0ulman

+2

我明白了;无论最终目的是什么,++都是一种聪明的方法(由于读写文件两次,速度会很慢,但是否重要取决于用例)。除非你担心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