使用“选择字符串-模式”从文件中删除行时,第一行留空

时间:2019-03-21 20:45:16

标签: powershell csv select-string

我有一个看起来像这样的简单文本文件...

A,400000051115,null,null,null,null,null,null,null,20190312,090300,Answer Machine,2019,3,14,10,0
A,400000051117,null,null,null,null,null,null,null,20190312,090300,Confirmed,2019,3,14,10,30
A,400000051116,null,null,null,null,null,null,null,20190312,090300,Answer Machine,2019,3,14,11,0
A,400000051114,null,null,null,null,null,null,null,20190312,090300,Wants to Cancel,2019,3,14,9,0
A,400000051117,null,null,null,null,null,null,null,20190312,091800,SMS Sent,2019,3,14,10,30
A,400000051116,null,null,null,null,null,null,null,20190312,091800,SMS Sent,2019,3,14,11,0
A,400000051115,null,null,null,null,null,null,null,20190312,091800,SMS Sent,2019,3,14,10,0
A,400000051116,null,null,null,null,null,null,null,20190312,093000,Appointment Cancelled/Rescheduled Via SMS,2019,3,14,11,0

我需要将除“ SMS Sent”外的所有行保存到新文件中。我正在使用以下...

get-content $SourceFile.FullName | select-string -pattern 'SMS Sent' -notmatch | Out-File $targetFile

为什么在生成的文件中我第一行空白?

1 个答案:

答案 0 :(得分:0)

如果将Out-File $targetFile更改为Out-Host,甚至只是省略了管道中的最后一个段,那么控制台输出中也会出现空白行。

Get-Content的输出模拟为Set-Content,因此,如果将Out-File $targetFile更改为Set-Content $targetFile,则第一行不再是空白。

此外,由于您正在使用CSV文件,因此可以使用Import-CSV来读取数据,并使用Where-Object来过滤该特定列,尽管指定标题需要一些额外的工作并从输出文件中忽略它们...

$csvHeaders = 1..17 | ForEach-Object -Process { "Column $_" }
$csvHeaders[11] = 'Status'

Import-Csv -Path $SourceFile.FullName -Header $csvHeaders `
    | Where-Object -Property 'Status' -NE -Value 'SMS Sent' `
    | ConvertTo-Csv -NoTypeInformation `
    | Select-Object -Skip 1 `
    | Set-Content $targetFile

...写着...

"A","400000051115","null","null","null","null","null","null","null","20190312","090300","Answer Machine","2019","3","14","10","0"
"A","400000051117","null","null","null","null","null","null","null","20190312","090300","Confirmed","2019","3","14","10","30"
"A","400000051116","null","null","null","null","null","null","null","20190312","090300","Answer Machine","2019","3","14","11","0"
"A","400000051114","null","null","null","null","null","null","null","20190312","090300","Wants to Cancel","2019","3","14","9","0"
"A","400000051116","null","null","null","null","null","null","null","20190312","093000","Appointment Cancelled/Rescheduled Via SMS","2019","3","14","11","0"

...到$targetFile。请注意,所有值现在都被引用。如果您的输入文件确实具有标题,那么您可以简单地使用...

Import-Csv -Path $SourceFile.FullName `
    | Where-Object -Property 'Status' -NE -Value 'SMS Sent' `
    | Export-Csv -NoTypeInformation -LiteralPath $targetFile

无论哪种情况,输出文件都不会包含前导空白行。