如何在使用PowerShell的模式之前用文本文件中的空格替换每个逗号

时间:2016-07-28 19:56:51

标签: powershell

我有一个文本文件,其中包含以下格式的行:

FirstName,LastName,SSN,$x.xx,$x.xx,$x.xx
FirstName,MiddleInitial,LastName,SSN,$x.xx,$x.xx,$x.xx

这些行可以是任何一种格式。例如:

Joe,Smith,123-45-6789,$150.00,$150.00,$0.00
Jane,F,Doe,987-65-4321,$250.00,$500.00,$0.00

我希望基本上将SSN之前的所有内容转换为名称的单个字段:

Joe Smith,123-45-6789,$150.00,$150.00,$0.00
Jane F Doe,987-65-4321,$250.00,$500.00,$0.00

如何使用PowerShell执行此操作?我想我需要使用ForEach-Object,并在某些时候取代","用" ",但我不知道如何指定模式。我也不知道如何使用带有$ _的ForEach-Object。在哪里我可以指定" SkipUntil"模式。

非常感谢!

2 个答案:

答案 0 :(得分:1)

Mathias是正确的;您想使用-replace运算符,它使用正则表达式。我想这会做你想要的:

$string -replace ',(?=.*,\d{3}-\d{2}-\d{4})',' '

正则表达式使用前瞻(?=)查找任何数字后面跟着的任何逗号(。是任何字符,*是任意数字,包括0),然后立即跟着逗号然后是SSN(\ d {3} - \ d {2} - \ d {4})。 "零宽度断言"的概念,例如这个前瞻,仅仅意味着它用于确定匹配,但它实际上并未作为匹配的一部分返回。

我们如何只能匹配名称中的逗号,然后用空格替换它们。

答案 1 :(得分:0)

我知道它得到了回答,而且整齐地说,但是我试图想出一个使用正则表达式的替代方法 - 计算一行中逗号的数量,然后替换前一个或前两个逗号。线。

但字符串无法计算字符在不使用正则表达式引擎(*)的情况下出现的次数,并且在不使用正则表达式引擎(**)的情况下,替换不能执行特定次数,因此它是不是很整洁:

$comma = [regex]","
Get-Content data.csv | ForEach { 

    $numOfCommasToReplace = $comma.Matches($_).Count - 4
    $comma.Replace($_, ' ', $numOfCommasToReplace)

} | Out-File data2.csv

完全避免使用正则表达式引擎,只是为了好玩,让我得到这样的东西:

Get-Content .\data.csv | ForEach { 

    $1,$2,$3,$4,$5,$6,$7 = $_ -split ','
    if ($7) {"$1 $2 $3,$4,$5,$6,$7"} else {"$1 $2,$3,$4,$5,$6"}

} | Out-File data2.csv

(*)($line -as [char[]] -eq ',').Count

(**)while ( #counting ) { # split/mangle/join }