我有一个文本文件,其中包含以下格式的行:
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"模式。
非常感谢!
答案 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 }