2017-08-24 42 views
2

之間我有一個CSV與內容,如文件:刪除逗號時,從一批或報價辣妹

A,B,C 
D,"E,F",G 
H,I,"J,K,L" 

我需要的時候去掉引號之間的逗號(也去掉引號,但事實並非如此重要):

A,B,C 
D,EF,G 
H,I,JKL 

我看着豪華-replace操作,但我不能讓它捕獲多個組值:

PS >"D,`"E,F`",G" -replace "`"((?:[^,`"]+)\,?)+`"", '$1' 
D,F,G 

您可以看到組重複的時間,只保留捕獲的最後一個值。有沒有辦法實現我想要的轉換?

https://regex101.com/r/ON1rgp/1/

回答

3

你可以定義一個回調傳遞給Regex::Replace方法,你可能只是抓住引號之間的部分,並刪除所有,有:

$callback = { param($match) $match.Groups[1].Value.Replace(',','') } 
$s = "D,`"E,F`",G" 
$rex = [regex]'"([^"]*)"' 
$rex.Replace($s, $callback) 

enter image description here

的正則表達式是"([^"]*)"匹配",然後捕獲到組1(即$match.Groups[1].Value)任何零個或更多的字符她比"然後匹配"。如果你已經逃脫了報價,它將需要增強,但方法將是相同的。

2

下面是使用正則表達式的替代:

Import-Csv your.csv | Foreach-Object { 
    $_.PSObject.Properties | ForEach-Object { $_.Value = $_.Value -replace ',' } 
    $_ 
} | Export-csv your-new.csv -NoTypeInformation 

我們使用Import-CSV導入數據作爲PowerShell的對象。然後,我們通過遍歷CSV每一行的每個屬性的值來替換','字符。然後我們將其導出爲新的CSV。