2013-04-16 18 views
5

Szukasz pomocy na temat najlepszych praktyk, jak jestem PowerShell początkujących,PowerShell filtr CSV

Mam pliku csv i chciałbym, aby odfiltrować każdy wiersz w pliku CSV z wyjątkiem wierszy zawierających „Nie zainstalowana”

Chciałbym wtedy filtrować wyniki na osobnych plikach CSV z listą komputerów, a także wykluczać wszelkie wiersze zawierające dopasowanie.

Każda pomoc lub punkty początkowe będą mile widziane!

Odpowiedz

5

Dla pierwszej części, można użyć Select-String -Notmatch ... np

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

Jeśli plik CSV dzieje się Unicode, a następnie usunąć "-Enc ASCII" część ponieważ domyślnie Out-File to Unicode. Jeśli chodzi o drugą część pytania, będziesz musiał być nieco bardziej konkretny. Jednakże, należy spojrzeć na pomoc w Import-Export-CSV i CSV:

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

To faktycznie działa bardzo dobrze. Wcześniej miałem podobne polecenia, ale nie określiłem -Enc ascii, więc powoduje to niepożądane skutki. Druga część musi porównać nowy plik data.csv z inną listą CSV, która ma wykluczenia, które należy odfiltrować. Powyższe polecenie prawdopodobnie zadziała, może uda mi się pobrać zawartość listy wykluczeń do tablicy i zmienić "Nie zainstalowane" w $ wyłączenia? – user2284702

+1

Jeśli używasz Import-Csv do pobierania obu plików CSV, kończy się tablica obiektów, w których każdy obiekt ma właściwości odpowiadające polom w pliku CSV. Więc możesz zrobić coś takiego '$ importedCsv1 | Gdzie {$ csv1Field = $ _. Field; ($ importCsv2 | Gdzie {$ _. FilterField -eq $ csv1Field}) .Potwierdzić-0} ' –

+0

$ csv | Select-String -NotMatch $ exclusions | Out-File $ hosts -Enc ascii działa w celu usunięcia wszystkich wykluczeń z pliku data.csv, ale pozostawia pusty wiersz u góry dla każdego dopasowania, które usuwa. Jakieś pomysły? – user2284702

3

get-help *csv*

get-help import-csv -examples

pliku csv przykład o nazwie test.txt

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

zaimportować plik do zmiennej PowerShell i filtrować je.

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

Natknąłem się na to pytanie, gdy próbuje dowiedzieć się, jak zrobić to samo siebie.

co wymyśliłem jako roztwór był następujący:

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

Pierwszy wiersz jest po prostu pokazując mi filtrowanie tablicę, że mam za Import-CSV dostać tylko wyniki chciałem.

Niestety, ten pozostawia mnie z tablicy MatchInfo, a każda tablica jest w następującym formacie:

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

nie eksportować z powrotem do pliku CSV ładnie w ogóle, jak jest.

Tak, zdecydowałem się utworzyć nową macierz wyjściową ($FilteredArray).

Następnie rurami właściwość Line tablicy matchinfo z Select-String pętlę foreach i dla każdej linii podzielić ją na średnikiem, a następnie usunąć @ {} chars i wszelkie spacje.

Następnie utworzę nowy System.Object, a następnie wypiętrzę uporządkowane wyjście do innej pętli foreach, tworząc nowe właściwości Note w obiekcie, nazywając je od bieżącego wiersza w uporządkowanym wyjściu aż do znaku =, a wartość będącą pozostałością tekst po znaku =.

Co ja skończyć z jest:

PS C:\Users\Graham> $obj 

Column1   : Value1 
Column2   : Value2 
Column3   : Value3 

a przefiltrowany tablica wygląda następująco:

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

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

Rozwiązanie podane przez @ paul-rowland osiągnęłoby ten wynik w prostszy sposób, używając filtra '-notmatch'. Sprawdź, w której kolumnie znajduje się Twój tekst, który chcesz wykluczyć (lub dopasować) - w mojej próbce nazwa "OSName" to kolumna zawierająca nazwy systemów operacyjnych i chcę wykluczyć systemy operacyjne serwera. Aby utworzyć przefiltrowaną tabelę z wpisami jako obiekty PSCustomObjects, które są gotowe do dalszego przetwarzania, zaimportuj plik CSV, a następnie wykonaj polecenie '$ przefiltrowane = $ csv | gdzie {$ _. OSName -notmatch 'Server'} ' – Trix

Powiązane problemy