2016-08-06 9 views
3

以下のコードで改行コードを削除するために、区切りのCSVをPowerShellに持ってきていますが、余分なカンマも削除する必要があります。正規表現。Powershellの正規表現で区切り記号ではなくカンマを削除する

(Get-Content -Path $fullpath -Raw) -replace '(?<!\x0d)\x0a'," " | out-file $fullpath 

私の入力CSVは以下のとおりです。

"field1","field2","field3","fred,mary,john,brian","field5" 

だから私は(引用符を含む)","を維持しますが、自分で他のカンマを削除したいです。

だから私は、で終わるだろう:

"field1","field2","field3","fred mary john brian","field5" 
+2

なぜ正規表現ですか?あなたは有効なCSVを持っています。カンマImport-Csvを本当に削除する必要がある場合は、フィールドを選択して書き換えます。 –

+0

@Calzor:サンプルが有効なCSVであることを前提としていたので、後ろの引用符を '' field3 "'に追加しました。ようこそ! –

+0

問題はCSVがエクセル内で「リンク」されていることです。ラインフィードと余分なコンマが混乱していることを意味します。 powershell経由のインポート時にソースを修正する方が簡単です –

答えて

2

これはそれを行います。

(Get-Content -Path $fullpath -Raw) -replace '(?<!"),|,(?!")',' ' | out-file $fullpath 

それだけのどちらか、それに続く引用符またはないで進めていないコンマのと一致します。引用符で囲まれたものを除くすべてのコンマについても同様です
","

のみ特定のフィールドのカンマを削除するには、ヘッダーでインポート、CSVを使用することができます。

$csvin = Import-Csv -Path $fullpath -Header f1,f2,f3,f4,f5 
$csvin |%{$_.f4=$_.f4.replace(',',' ')} 
$csvin |ConvertTo-Csv -NoTypeInformation |Select-Object -Skip 1 |Set-Content -Path $fullpath 
+1

正規表現の解決策では、引用符付きのフィールドはコンマで始まらないか、終わらないと仮定しています。 –

+0

ありがとうございますこれは動作し、CSVを整理するようです –

+0

正規表現を修正しました。今度は最後と最初のカンマを引用符で囲みます。コンマが隣にあるフィールドがある場合でも。 – LukStorms

1

CSVファイルをインポートして、すべてのフィールドからカンマを削除し、再度CSVとして書き込むことができます。構造をそのまま維持する正規表現を書こうとする必要はありません:

$data = Import-Csv foo.csv 
$columns = $data | gm | where MemberType -eq NoteProperty | % Name 
$newdata = $data | %{ 
    foreach ($c in $columns) { 
    $_.$c = $_.$c -replace ',',' ' 
    } 
} 
$newdata | Export-Csv foo-rewritten.csv 
+0

++ですが、 'Export-Csv'はデフォルトで!ASCII_エンコーディングを使用していることを常に指摘する価値があるので、常に' -Encoding'パラメータを使用することをお勧めします。 – mklement0

関連する問題