2013-04-16 4 views
5

Hilfe der Suche über die besten Praktiken, wie ich Powershell-Neuling bin,Powerfilter csv

Ich habe eine CSV-Datei, und ich würde jede Zeile in der CSV mit Ausnahme der Zeilen mit „Nicht installiert“, um herauszufiltern wie

Ich möchte dann diese Ergebnisse gegen eine separate CSV-Dateien mit einer Liste von Computern filtern und auch Zeilen mit einer Übereinstimmung auszuschließen.

Jede Hilfe oder Startpunkte wären willkommen!

Antwort

5

Für den ersten Teil können Sie Select-String -Notmatch ... zB verwenden:

$file = "data.csv" 
$csv = Get-Content $file 
$csv | Select-String -Notmatch 'Not Installed' | Out-File $file -Enc ascii 

Wenn Ihre CSV-Datei Unicode sein geschieht, dann wird, da der Standard die "-ENC ascii" Teil entfernen für Out-File ist Unicode. Was den zweiten Teil Ihrer Frage betrifft, müssen Sie etwas genauer sein. Sie sollten jedoch auf die Hilfe suchen auf Import-Csv und Export-Csv:

man Import-Csv -full 
man Export-Csv -full 
+0

Dies ist eigentlich wirklich gut funktioniert. Ich hatte vorher ähnliche Befehle, habe aber nicht -Enc ascii angegeben, damit es mir unerwünschte Ergebnisse gibt. Der zweite Teil muss die neue data.csv-Datei mit einer anderen csv-Liste vergleichen, die Ausschlüsse aufweist, die herausgefiltert werden müssen. Der obige Befehl würde wahrscheinlich funktionieren, vielleicht kann ich einfach den Inhalt der Ausschlußliste in ein Array holen und 'Nicht installiert' die $ Ausschlüsse ändern? – user2284702

+1

Wenn Sie mit Import-Csv beide CSV-Dateien abrufen, werden Sie mit einem Array von Objekten enden, wobei jedes Objekt Eigenschaften aufweist, die den Feldern in der CSV-Datei entsprechen. Sie könnten also etwas wie '$ importierteCsv1 | Wobei {$ csv1Field = $ _. Feld; ($ importedCsv2 | Wobei {$ _. FilterField -eq $ csv1Field}). Count -eq 0} ' –

+0

$ csv | Select-String -NotMatch $ Ausschlüsse | Out-File $ hosts -Enc ascii entfernt alle Ausschlüsse aus der Datei data.csv, hinterlässt jedoch bei jeder Streichung eine leere Zeile oben. Irgendwelche Ideen? – user2284702

3

get-help *csv*

get-help import-csv -examples

Datei Beispiel csv test.txt

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

Importieren Sie die Datei in eine Powershell-Variable und filtern es nannte.

$p = Import-CSV .\test.txt 
$p | Where { $_.header1 -eq 'installed'} 
0

über diese Frage kam, wenn sie versuchen, wie zu arbeiten, mir die gleiche Sache zu tun.

Was kam ich mit, wie eine Lösung war wie folgt:

$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 
          } 

Die erste Zeile nur mir zeigt das Array Filtern, die ich über Import-CSV bekam nur die Ergebnisse zu erhalten ich wollte.

Leider ist dies lässt mich mit einem Match Array, wobei jedes Array im folgenden Format sein:

@{Column1=Value1; Column2=Value2; Column3=Value3;} 

Diese exportiert nicht schön an alle aus, um CSV zurück, wie es ist.

Also entschied ich mich, ein neues Ausgabe-Array ($FilteredArray) zu erstellen.

Ich leitete dann die Line Eigenschaft des Matchinfo-Arrays von Select-String in eine foreach-Schleife, und für jede Zeile, ich es auf das Semikolon aufgeteilt, dann entferne ich die @ {} Zeichen und alle führenden Leerzeichen.

Ich erstelle dann eine neue System.Object, dann piped die aufgeräumte Ausgabe in eine andere foreach-Schleife, neue NoteProperty im Obj, Benennung von der aktuellen Zeile in der aufgeräumten Ausgabe bis zum = Zeichen, und der Wert ist der Rest Text nach dem Zeichen =.

Was ich am Ende mit:

PS C:\Users\Graham> $obj 

Column1   : Value1 
Column2   : Value2 
Column3   : Value3 

Und das gefilterte Array wie folgt aussieht:

PS C:\Users\Graham> $FilteredArray[0..3]|Format-table 

Column1   Column2  Column2          
-------   -------  ------- 
Value1   Value2   Value3 
Value1   Value2   Value3 
Value1   Value2   Value3 
+0

Die von @ paul-rowland angegebene Lösung hätte dieses Ergebnis auf einfachere Weise erreicht, während der Filter "-notmatch" verwendet wurde. Finden Sie heraus, welche Spalte Ihr Text ist, den Sie ausschließen möchten (oder übereinstimmen) - in meinem Beispiel ist "OSName" die Spalte, die Betriebssystemnamen enthält, und ich möchte Server-Betriebssysteme ausschließen. Um eine gefilterte Tabelle mit den Einträgen als PSCustomObjects für die weitere Verarbeitung bereit zu machen, importieren Sie die CSV und führen Sie dann etwas wie $ filted = $ csv | wo {$ _. OSName -notmatch 'Server'} ' – Trix

Verwandte Themen