6

由于我是 Powershell 新手,因此寻求最佳实践方面的帮助,

我有一个 csv 文件,我想过滤掉 csv 中的每一行,除了包含“未安装”的行

然后,我想根据包含计算机列表的单独 csv 文件过滤这些结果,并排除任何包含匹配项的行。

任何帮助或起点将不胜感激!

4

3 回答 3

6

对于第一部分,您可以使用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
于 2013-04-16T04:46:28.633 回答
4

get-help *csv*

get-help import-csv -examples

名为 test.txt 的示例 csv 文件

header1,header2,header3
installed,2,3
not installed,2,3

将文件导入到 powershell 变量中并对其进行过滤。

$p = Import-CSV .\test.txt
$p | Where { $_.header1 -eq 'installed'}
于 2013-04-16T04:44:37.097 回答
0

在尝试自己做同样的事情时遇到了这个问题。

我想出的解决方案如下:

$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
于 2015-06-15T09:27:27.393 回答