2016-07-28 63 views
1

我更換一個文本文件中的每個空間逗號模式之前,我有這種格式的行文本文件:如何使用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對象,以便我可以指定「SkipUntil」模式。

非常感謝!

+1

'-replace '(?<= \ W),'「,「' –

回答

1

Mathias是正確的;你想使用-replace運算符,它使用正則表達式。我認爲這會做你想要什麼:

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

正則表達式使用前瞻(?=)來尋找那些後跟任意數量的任意字符(任何逗號是任意字符,*是任何數字其中包括0),然後緊跟着一個逗號,後跟一個SSN(\ d {3} - \ d {2} - \ d {4})。 「零寬度斷言」的概念,比如這種前瞻性,僅僅意味着它被用來確定匹配,但它並不實際作爲匹配的一部分返回。

這就是我們如何才能匹配名稱本身中的逗號,然後用空格替換它們。

+0

這工作完全!非常感謝。 RegEx總是給我燒心。 –

+1

如果你解釋正則表達式是如何工作的(什麼是先行的,爲什麼重要的是零寬度等),這個答案可能會從好到好。 ;) – briantist

+0

因此,您正在使用積極的前瞻(我不知道存在)來查找字符串中第一個逗號的開始和SSN表達式之前的逗號之間的任何逗號?除了* in?=。* ...之前的那段時間,我認爲我瞭解它,它指定它的寬度爲零。 –

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 }