2011-07-21 6 views
1

だから私のcsvファイルは次のようになります。私が好きなCSVドキュメントでは、PowerShellを使用して、反復して文字を挿入する必要が

J|T|W 
J|T|W 
J|T|W 

がするよう、最も可能性の高い正規表現を使用して、反復処理した後、 2つのパイプと内容\ |。+ {2}を作成し、タブ文字 `tを挿入します。

私はループするためにget-contentを使用すると仮定していますが、そこからどこに行くのかは分かりません。

また、ちょうどこれを考えた場合、次の行にオーバーランする可能性があるため、2つのパイプが別の行に表示されます。 new_stringにあなたが$1を使用してグループをキャプチャするために参照することができますが、あなたがそれを置くしたいと思うことを

$c = Get-Content foo.csv | Foreach {$_ -replace '<regex_here>','new_string'} 
$c | Out-File foo.csv -encoding ascii 

注:正規表現などで-replace演算子を使用することができますPowerShellで

-Thanks

+0

希望する結果を自由に表示してください。また、 'A | B | C | D'の場合はどうなりますか? – Qtax

+0

実際のクエリはより複雑です。必要なパイプ数を格納する変数があります。実際にはcsvに応じて中括弧の間に入りますが、主な問題は最後の "| content"の後にタブ文字を追加することです| D – Jerome

+1

の後のあなたのケース最後の '|'の後にタブを追加したいのですか? 's/\ |(?= [^ |] * $)/ | \ t /'この置き換えはPowerShellで行います。 – Qtax

答えて

3

[OK]を、私は答えにコメント・ディスカッションを移動します。より一般的なソリューションの場合、最初にCSVにエクスポートされるフィールドの数を決定する能力がある場合:

Import-csv .\test.csv -Delimiter '|' -Header (1..$fieldCount) | %{$_.$fieldCount = "`t$($_.$fieldCount)"; $_} | Export-CSV .\test_result.cs 
0

PowerShellは変数参照として$1を解釈しようとしません。

Import-csv .\test.csv -Delimiter '|' -Header 'One', 'two', 'three' | %{$_.Three = "`t$($_.Three)"; $_} | Export-CSV .\test_result.cs 

これは、3つのフィールドを有することが知られているファイルのために働く:それはそれは潜在的に有効な解決策であるように思えるので、

+0

私の例2ではそれらのグループの特定の数を数え、その後にタブ文字を挿入する必要があります。あなたの例を使用して、前にすべてのデータを変数に取り込み、それにタブ文字を追加することができると仮定していますが、どうすればできますか?たとえば、正規表現の場合は – Jerome

+0

となります。\ |。+ {2}その後にタブを追加する方法は?また、パイプがすべて同じ行にない場合は重要ですか? – Jerome

+0

*もし正規表現がその行に残したいものをすべて取得したら、この '$ _ -replace '(\ |。{2})'、' '$ 1't" 'を実行しますが、正規表現行全体をキャプチャしていないことを示します。実際に行が複数の行にまたがっている場合、Get-Contentを使うのは一度に1行を読み込み、複数の行にまたがる正規表現が必要なためです。この場合、Import-Csv(推奨)を使用するか、CSVファイル全体を1つの文字列として読み込み、 '(?sm)'ディレクティブで正規表現を使用することができます。 –

関連する問題