[英]powershell filter csv
寻找最佳实践的帮助,因为我是Powershell新手,
我有一个csv文件,我想过滤掉csv中的每一行,除了包含“未安装”的行
然后,我想根据包含计算机列表的单独csv文件过滤这些结果,并排除包含匹配项的任何行。
任何帮助或起点将不胜感激!
对于第一部分,您可以使用Select-String -Notmatch ...
例如:
$file = "data.csv"
$csv = Get-Content $file
$csv | Select-String -Notmatch 'Not Installed' | Out-File $file -Enc ascii
如果您的CSV文件恰好是Unicode,则删除“-Enc ascii”部分,因为Out-File的默认值是Unicode。 至于你问题的第二部分,你需要更具体一点。 但是,您应该查看Import-Csv和Export-Csv上的帮助:
man Import-Csv -full
man Export-Csv -full
get-help *csv*
get-help import-csv -examples
示例csv文件名为test.txt
header1,header2,header3
installed,2,3
not installed,2,3
将文件导入powershell变量并对其进行过滤。
$p = Import-CSV .\test.txt
$p | Where { $_.header1 -eq 'installed'}
在试图找出如何自己做同样的事情时,遇到了这个问题。
我想出的解决方案如下:
$Filtered = $Table|Select-String -Pattern $ExcludeStrings -NotMatch -SimpleMatch
$FilteredArray = @()
$Filtered.Line | foreach {$split = $_ -split ';';
$tidied = $split -replace '@|{|}|^ ';
$obj = New-Object System.Object
$tidied|foreach {$obj|Add-Member -MemberType NoteProperty -Name ($_.split('=')[0]) -Value ($_.split('=')[1])
}
$FilteredArray += $obj
}
第一行只显示我通过Import-CSV
过滤我得到的数组,只得到我想要的结果。
不幸的是,这给我留下了一个MatchInfo数组,每个数组都采用以下格式:
@{Column1=Value1; Column2=Value2; Column3=Value3;}
这根本不会很好地导出回CSV。
所以,我选择创建一个新的输出数组( $FilteredArray
)。
然后我管道的Line
从matchinfo阵列的属性Select-String
成foreach循环,并且对于每个线路,我分裂它的分号,然后我删除@ {}字符和任何前导空格。
然后我创建一个新的System.Object
,然后将整理的输出传递到另一个foreach循环,在obj中创建新的NotePropertys,将它们从整理输出中的当前行命名为=字符,值为剩余的文本=字符。
我最终得到的是:
PS C:\Users\Graham> $obj
Column1 : Value1
Column2 : Value2
Column3 : Value3
过滤后的数组看起来像:
PS C:\Users\Graham> $FilteredArray[0..3]|Format-table
Column1 Column2 Column2
------- ------- -------
Value1 Value2 Value3
Value1 Value2 Value3
Value1 Value2 Value3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.