![](/img/trans.png)
[英]Replace commas that are not within double inverted commas(“”) from csv files using powershell?
[英]PowerShell script to replace commas within double quotes with nothing
我有一個逗號分隔的 CSV 文件,我打算在其中將雙引號中的逗號替換為空,並將雙引號替換為空:
編者按:本題原形式要求“將[the]分隔符改為豎線”( |
),不再要求; gms0ulman 的答案是在它仍然存在的時候寫的。
$inform = Get-Content C:\test.csv
$inform | % {
$info = $_.ToString().Replace(",","")
$var = $info
$var | Out-file C:\test1.csv -Append
}
任何幫助將不勝感激。
在:
1,2,"Test,ABC"
出:
1,2,TestABC
導入 CSV。 將其轉換為具有不同分隔符的 CSV。 替換逗號。 將分隔符轉換回。 替換雙引號。 寫出結果文件。
Import-Csv -Path C:\MyFile.csv |
ConvertTo-Csv -Delimiter '|' |
ForEach-Object { $_ -replace ',',[String]::Empty } |
ConvertFrom-Csv -Delimiter '|' |
ConvertTo-Csv |
ForEach-Object { $_ -replace -replace '"',[String]::Empty } |
Set-Content -Path C:\MyFile_fixed.csv
我將把它分為兩個步驟。 另一個 StackOverflow 用戶可能會給你一個單行。
Import-Csv C:\test.csv | Export-Csv tempfile.csv -Delimiter "|"
(Get-Content tempfile.csv).Replace(",","").Replace('"',"") | Out-File test1.csv
以下應該做你想做的(在 PSv5.1 中測試):
Import-Csv C:\test.csv | ForEach-Object -Begin { $writeHeader = $True } {
if ($writeHeader) { $writeHeader = $False; $_.psobject.properties.Name -join ',' }
$_.psobject.properties.Value -replace ',', '' -join ','
} | Set-Content -Encoding UTF8 test1.csv
Import-Csv
將您的 CSV 文件讀入自定義對象( [pscustomobject]
實例),其屬性包含刪除雙引號的列值。
,
實例可以因此盲目地更換,而無需擔心列-分離,
實例。 問題是您不能在修改對象后使用Export-Csv
,因為它總是在所有輸出值周圍添加雙引號(后退)。
因此,必須使用ForEach-Object
為每個自定義對象執行自定義迷你腳本:
-Begin { $writeHeader = $True }
在開始時執行一次,以表示需要在第一個數據行之前輸出標題行。
$_.psobject.properties
是輸入對象上定義的所有屬性的集合,以標題列命名,並包含給定數據行的值。
$_.psobject.properties.Name -join ','
輸出標題行,只需將屬性名稱 - 即列標題 - 與,
以產生單個輸出字符串。
$_.psobject.properties.Value -replace ',', ''
刪除任何內部值,
實例(用空字符串替換它們),並且-join ','
再次將結果值按原樣與,
,輸出一個數據行。
Set-Content
- 這里比Out-File
更可取,因為輸出對象已經是字符串- 用於寫入輸出文件。
請注意-Encoding
參數以根據需要控制輸出字符編碼 -adjust。
在Windows PowerShell (版本高達 v5.1)中,不使用-Encoding
將默認為您系統的“ANSI”代碼頁(即使幫助主題聲稱使用 ASCII),而Out-File
將默認為 UTF-16LE(“Unicode” )。
你的csv有標題嗎? 要更改的值是否在同一列中?
如果它看起來像這樣:
h1,h2,h3
1,2,"Test,ABC"
3,4,"Test,DEF"
這應該有效:
$Csv = Import-Csv -path C:\MyFile.csv
$Csv.H3 | foreach {$_.Replace('"',"").Replace(",","")}
編輯:讓它工作。 但是和mklement0的解決方案基本一樣
$Csv = Import-Csv -path C:\MyFile.csv
$Csv | Foreach {$_.H3 = $_.H3.Replace(",","")}
$CsvObject = $Csv | Convertto-Csv -NoTypeInformation
$CsvObject.replace('"','') |
Set-Content C:\OutFile.Csv
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.