2017-06-29 134 views
2

我有一個逗號分隔的CSV文件,在那裏我打算裝在雙引號沒有逗號,也什麼也沒有替換雙引號:PowerShell腳本用什麼代替雙引號內的逗號

編者按 :本原始形式這個問題提出的「改變定界符管[該]」(|),這是不再要求; 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 
+0

請允許我給你的標準建議新人:如果答案解決您的問題,請通過點擊大的複選標記(✓)接受它旁邊以及可選贊成票它(最多投票需要至少15點聲望點)。 如果您發現其他答案有幫助,請投票給他們。接受(爲此你將獲得2點聲望點)和增加投票有助於未來的讀者。請參閱[相關幫助中心文章](http://stackoverflow.com/help/someone-answers)。 – mklement0

回答

2

您的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 
+0

++;也許你只是爲了可讀性而做了這些工作,但請注意,使用中間變量收集memory_中的所有結果對於大文件是有問題的。您可以使用單個管道,而是一次處理一個對象。 Quibble:'$ CsvObject'是一個不幸的變量名,因爲它包含一串strings_(lines)。 – mklement0

+0

好點。我對這個問題的解決方法是在創建csv文件之前嘗試修復格式問題,但可能會受到數據源的限制。似乎過度依賴txt文件,csv文件等。這可能是來自cmd的宿醉。有趣的是,Import-Csv產生一個對象,但Convertto-Csv產生的字符串乍看起來似乎不符合直覺。 – Dave

2

我將其分爲兩個步驟。另一個StackOverflow用戶可能會給你一個單行的。

Import-Csv C:\test.csv | Export-Csv tempfile.csv -Delimiter "|" 
(Get-Content tempfile.csv).Replace(",","").Replace('"',"") | Out-File test1.csv 
+0

@ mklement0我相信這是必需的,但OP已經在代碼中完成了這部分。原來的問題指定了分隔符從','更改爲'|'......我將它放在那裏,因爲我認爲最好一次完成,反對像OP一樣遍歷文件。 – gms0ulman

+2

我明白了;無論最終目的是什麼,++都是一種聰明的方法(由於讀寫文件兩次,速度會很慢,但是否重要取決於用例)。除非你擔心PSv2的兼容性,否則你可以用'Get-Content -Raw'加快速度;相反,如果文件太大而無法一次裝入內存,請在'ForEach'調用中執行'.Replace'調用。 更好的是,如果您使用'ConvertTo-Csv -NotypeInformation',則可以避免中間文件,如在培根位的答案中。 – mklement0

2

以下應做你想做的(在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參數用於控制輸出字符編碼 - 根據需要進行調整。

    • 不使用-Encoding將默認爲系統的「ANSI」代碼頁(即使幫助主題聲明爲ASCII),而Out-File將默認爲UTF-16LE(「Unicode」)。

2

導入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