2016-11-11 12 views
0

情報の行を持つcsvファイルがあります。 1つの行は、それが何をしているのか、そして次の行がそれが何をしたのかを教えてくれます。それが何もしなければ、それは次の行を持たないでしょう。私は何もしなかった行を除外したい。だから、次の行が欠けている場合はそこに残し、もしそれがあればそれを取り除いてください。次に、CSVの外観の例を示します。PowerShellを使用してCSVの次の行と行を比較します

Event 
Recipient Disposition: 1 
Message Disposition: 1 
Recipient Disposition: 2 
Recipient Disposition: 3 
Message Disposition: 3 
Recipient Disposition: 4 
Recipient Disposition: 5 
Message Disposition: 5 
Recipient Disposition: 6 
Message Disposition: 6

は、私はちょうどRecipient Disposition: 2Recipient Disposition: 4ろ過し、他は削除します。

PowerShellのアイデアはありますか?

+0

は文字通りそのようにフォーマットされようとして各行ですか?いくつかのメッセージの後にコロンとそれに続く数字が続きますか?これは普通のテキストファイルのように見えます。 –

+1

これはCSVファイルではありません。または、ただ1つの列で本当に退屈なもの。 – Joey

+0

あなたは2と4を意味しましたか?あなたが1と4を保持したいのであれば、それらの2つを残りのレコードと区別することは私には不明です。 –

答えて

1

あなたの例は正しいですか?説明から1、3、5、6は残っていないはずですか?

どちらの方法でも、Select-Stringと正規表現を使用して、ファイルから必要な行を選択することができます。 Contextオプションを追加することによって、次の行を選択することもできます。パイプをWhere-Objectオブジェクトに入れ、いくつかのロジックを使って不要なものをフィルタリングします。このような何かは:より良いスクリプト

このスクリプトは、それを他の方法でラウンドを行うに説明する

Line 
---- 
Recipient Disposition: 1 
Recipient Disposition: 3 
Recipient Disposition: 5 
Recipient Disposition: 6 
+0

私はこれらの結果とは逆の結果を得ようとしています。 –

+0

結果を別にすれば、あなたの問題を解決するために、 '-Context'と組み合わせた' Select-String'をどのように使うことができるのかが分かりました。 –

0

編集し

Select-String .\your_file.txt -Pattern '^Recipient' -Context 0, 1 | ? { 
    ($_.Context.PostContext -split ':\s*')[1] -eq ($_.Line -split ':\s*')[1] 
} | Select line 

これは、次の出力を生成します。最後の行が格納され、現在の行と比較されます。 switchコマンドは、Ìf this than thatスケジューラとして機能します。現在の行がRecipientで始まっていれば、最後の行も始まって​​いるかどうかを確認するIfが実行され、trueならば最後の行が出力されます。カスではカーレント。メッセージは何も行われません。他の場合(デフォルト)、最初の行のように行が出力されます。

$lines = Get-Content Test.csv 
Foreach ($line in $lines) { 
    switch -wildcard ($line) { 
    "Recipient*" {If ($last -match "^Recipient"){$last}} 
    "Message*" {} 
    default  {$line} 
    } 
    $last = $line 
} 

は、この出力を表示します:

Event 
Recipient Disposition: 2 
Recipient Disposition: 4 
Recipient Disposition: [554 Denied - Denied by (Mode: normal); Mode: ; Queued: no] 
Recipient Disposition: [554 Denied - Denied by (Mode: normal); Mode: ; Queued: no] 
+0

それは私が望む結果ですが、それは私にとってはうまくいかないようです。情報をどこに置くのですか? –

+0

最後の行は$ lastに格納されます。スイッチは現在の行の内容に作用します。Recipientで始まる場合、中括弧で囲まれたコマンドが実行されます。これは、var $ lastの始まりをRegExでチェックします。受取人は、$ lastに格納された最初の行を出力して出力します。 – LotPings

+0

より正確なcsvバージョンを含めるには、本当に質問を編集する必要があります。私はそれを追加し、スクリプトを再実行し、私の編集された答えに結果を示します。 – LotPings

関連する問題