2017-05-17 14 views
1

一部のフィールドのレコードの一部にカンマが含まれているCSVファイルを受け取ります。私は、行は以下のすべての値がカンマ区切りでない場合は、フィールド内のカンマを削除しますが、区切り文字は削除しません。

1,John,Wayne,"movies,actor",1950s

のように見えるメモ帳でファイルを開くときにだから私は、上記の例では4列で映画や俳優の間にコンマを削除する構文を書くためにスクランブルしており、スペースで置き換えてください。ファイルをCSV形式で出力します。

ここでは、「映画、俳優」の文字列全体をスペースで置き換えた以下の記事を紹介します。

(Get-Content $path) -replace '(".*),(.*")',' ' | Out-File -Encoding UTF8 $newpath 

カンマのみをスペースで置き換えるにはどうすればよいですか?

答えて

0

で使用しているマッチグループを利用実際にそれをより簡単に行うことができます。交換するときは、直接以下のようにキャプチャグループを参照することができます。

OPソリューションに非常によく似
(Get-Content $path) -replace '"(.*?),(.*?)"','$1 $2' 

その、あなたは言葉だけではなく、引用符で2つのキャプチャグループを作成除いて。次に、2つの値はそれぞれ$ 1と$ 2として置換文字列で直接参照されます。

+1

これは、掲載されたOPで動作しますが、遅かれ早かれ破綻するでしょう。ファイルに '1、John、Wayne、" movies、actor "、" 1950s "のようなものが含まれている場合。あなたは非貪欲な検索を使って調整することができますが、誰かがそれを破る入力を思いつくことができると確信しています。結局のところ、最も堅牢なソリューションはNickが投稿したものです。 –

+0

私はニックスも壊す入力を思いつくことができるとかなり確信しています:)しかし、私はあなたのポイントを取る。非貪欲型または単語マッチングに変更すると、それが複数の値を含むことができる唯一のフィールドだとすれば、それをかなり簡単に解決できます。しかし、他のすべての分野でも引用符やカンマを考慮する解決策が必要な場合は、全く異なる解決策が必要です。 –

+0

@ MarkJakobsenここでは、OPは、csvのすべての列からコンマを削除しても問題ないことを前提にしています。 – 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
  • たちはNewCSVに各行を追加すると、我々はコンマ
  • 輸出NewCSVに置き換えるん$のcsv
  • から行を移入し、新しいオブジェクトを作成します。オブジェクト

複雑に見えますが、パイプラインを使用して1行にほぼ圧縮できます

$csv | % { $_.Desc = $_.Desc -replace ","," "; $_ | Export-Csv C:\New.csv -Append -NoClobber}

+1

私にこれを愛するが、これは最も強力な、将来の証明ソリューションです。 –

+0

@LievenKeersmaekers Regexは、問題を解決したり、正しく書かないとアプリ全体をロックする強力なツールです。これらの他の答えで仮定されているのは、問題ごとに正規表現にジャンプして問題を引き起こす理由の明確な例です。 – Nick

+0

ありがとうございました@Nick – sarikas

0

我々はこのように、正規表現をオンラインで行うことができます。

(Get-Content D:\dummycsv.csv) | %{if($_ -match '(".*),(.*")'){$_ -replace $matches[0],($matches[1]+' '+$matches[2]);$_}} 

私は正規表現にマッチすることだし、あなたが$matches変数

+0

私の答えの一番下を見ると、私の答えは1行に圧縮されています。より短く、読みやすく、効率的です。マッチ変数とif文を混乱させる必要はありません。あなたはそれを複雑にしています。 – Nick

+0

@ニックはそれを逃しました、私の悪いですが、あなたのオンライナーはまだ$ csvオブジェクトの作成を必要としていると信じています。OPがどちらに合っているかを決定してください –

+0

それははい、必要ありません。これは私が人々が読んで理解することを期待する無料サービスのコードではありません。例えば、あなたのライナーには私のように輸出CSVが含まれていません。 – Nick

関連する問題