2017-05-17 56 views
1

我收到一个CSV文件,其中某些字段的某些记录在其中包含逗号。所以,当我在记事本打开该文件中的一行看起来如下当并非所有值都以逗号分隔时,在PowerShell中删除逗号而不是分隔符

1,John,Wayne,"movies,actor",1950s

我已经炒写的语法来删除电影和演员之间的逗号第4列在上面的例子,用空格替换它。然后再将该文件输出为CSV。

下面是我在下面,它用空格替换整个字符串“电影,演员”。

(Get-Content $path) -replace '(".*),(.*")',' ' | Out-File -Encoding UTF8 $newpath 

如何仅替换空格的逗号?

回答

0

你实际上可以通过更换简单得多。更换时,可以参考下面直接捕获组:

(Get-Content $path) -replace '"(.*?),(.*?)"','$1 $2' 

它非常类似于OP的解决方案,除非你创建只有一行字,不包括引号两个捕获组。然后这两个值直接在替换字符串中被引用为$ 1和$ 2。

+1

这适用于OP发布的内容,但迟早会中断。如果这些文件包含“1,约翰,韦恩”,“电影,演员”,“20世纪50年代”等。您可以通过使用非贪婪搜索来进行调整,但我相当有信心有人可以提出一个输入来打破这一点。最后,最强大的解决方案就是Nick发布的内容。 –

+0

我非常有信心我可以想出一个可以打破尼克斯的输入:)但我明白你的观点。更改为非贪婪或单词匹配将相当容易地解决,假设这是唯一可以包含多个值的字段。但是,如果需要解决所有其他领域中可能的引号和逗号的解决方案,则需要完全不同的解决方案。 –

+0

@MarkJakobsen你在这里做了一个假设:OP很好,从csv的每一列中删除了逗号,尽管OP声明第4列是他想从逗号中删除的那一列。 – Nick

1

所以你可以尝试写正则表达式来去掉逗号,但是我会倾向于将它分解出来,以便于修改其他字段的支持性和易用性。

$csv = import-csv C:\Old.csv 
$NewCSV = @() 

Foreach($row in $csv) 
{ 
    $Object = New-Object -TypeName PSObject 
    $Object | Add-Member -Type NoteProperty -Name "ID" -Value $csv.ID 
    $Object | Add-Member -Type NoteProperty -Name "First" -Value $csv.First 
    $Object | Add-Member -Type NoteProperty -Name "Last" -Value $csv.Last 
    $Object | Add-Member -Type NoteProperty -Name "Desc" -Value $csv.Desc -replace ","," " 
    $Object | Add-Member -Type NoteProperty -Name "Year" -Value $csv.Year 
    $NewCSV += $Object 
} 

$NewCSV | Export-Csv C:\New.csv 
  • 导入CSV
  • 创建一个新的对象,从$ CSV
  • 行填充它作为我们的每一行添加到NewCSV我们做了替换逗号
  • 导出NewCSV反对

它看起来复杂,但你几乎可以紧凑它在一个行中使用管道

$csv | % { $_.Desc = $_.Desc -replace ","," "; $_ | Export-Csv C:\New.csv -Append -NoClobber}

+1

爱的正则表达式,但这对我来说是最强大的,未来证明的解决方案。 –

+0

@LievenKeersmaekers正则表达式是一个功能强大的工具,可以解决或解决您的问题,或者如果您没有正确书写,就锁定整个应用程序。这些其他答案中的假设是明确的例子,说明为什么跳到正则表达式以解决所有问题都会导致问题发生。 – Nick

+0

谢谢@Nick – sarikas

0

,我们可以在网上用正则表达式做到这一点,是这样的:

(Get-Content D:\dummycsv.csv) | %{if($_ -match '(".*),(.*")'){$_ -replace $matches[0],($matches[1]+' '+$matches[2]);$_}} 

我匹配的正则表达式,并利用您所使用的比赛组,$matches可变

+0

查看我答案的底部,以便将我的答案压缩到一行。它更短,更易于阅读并且更高效。你根本不需要搞乱匹配变量和if语句。你过于复杂了。 – Nick

+0

@Nick错过了它,我的坏,但我相信你的oneliner仍然需要创建$ csv对象。让OP决定哪一个适合他 –

+0

它确实需要它,它的微不足道的补充。这不是免费服务的代码,我希望人们阅读和理解。例如你的一个班轮不包括我的出口csv。 – Nick