簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM