2017-05-17 61 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