2016-11-11 80 views
0

我有一个包含信息行的csv文件。一行会告诉我它在做什么,下一行会告诉我它做了什么。如果它没有做任何事情,它不会有下一行。我想过滤掉没有做任何事的行。所以,如果它遗漏了下一行,请离开那里,如果有,请将其删除。以下是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文件。或者只有一个专栏的无聊。 – Joey

+0

你的意思是2和4吗?因为如果你想保留1和4,我不清楚这两者与其他记录有何区别。 –

回答

1

你的例子正确吗?从解释应该不是1,3,5和6保持?

无论哪种方式,您可以使用的一种方法是使用Select-String和正则表达式从文件中选择所需的行。通过添加Context选项,您还可以选择下一行。用一些逻辑把它们转换成一个Where-Object对象来过滤掉你不想要的对象。事情是这样的:

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

这将产生以下输出:

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

我正在寻找与这些结果相反的结果。 –

+0

除了结果之外,它是您如何使用'Select-String'与'-Context'结合来解决您的问题的原则。 –

0

编辑更好地解释脚本

这个脚本做它反过来。它存储最后一行并与当前行进行比较。切换命令充当Ìf this than that调度程序。如果当前行以RecipientIf开始,以检查最后一行是否也开始执行,并且如果为true,则输出最后一行,因为该行没有Messae后续行。在CAS中。行开始于消息没有完成。在其他情况下(默认),输出的行就像第一行一样。

$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开始,则执行花括号中的命令,该命令与RegEx一起检查var $ last的开始,如果它匹配从开始“^”到Rec,我们有两个连续的收件人行并输出存储在$ last中的第一个。 – LotPings

+0

你真的应该编辑问题来包含更精确的csv版本。我附加并重新运行脚本,并在我编辑的答案中显示结果。 – LotPings