2013-04-16 8 views
5

Нужна помощь по наилучшей практике, как я Powershell новичку,PowerShell фильтр CSV

У меня есть файл CSV, и я хотел бы, чтобы отфильтровать все строки в формате CSV для строк, содержащих «Не установлено»

кроме

Я бы хотел отфильтровать эти результаты с отдельными файлами csv, содержащими список компьютеров, а также исключить любые строки, содержащие совпадение.

Будут приняты во внимание любые полезные или отправные точки!

ответ

5

Для первой части, вы можете использовать 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 и Экспортно-Csv:

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

Это на самом деле работает очень хорошо. Раньше у меня были подобные команды, но не указывал -Enc ascii, так что это игра мне нежелательных результатов. Вторая часть должна сравнить новый файл data.csv с другим списком csv, который имеет исключения, которые необходимо отфильтровать. Возможно, выработали вышеприведенную команду, возможно, я могу просто получить-содержимое списка исключений в массив и изменить «Не установлен» $ исключений? – user2284702

+1

Если вы используете Import-Csv для загрузки файлов CSV, вы завершаете массив объектов, каждый из которых имеет свойства, соответствующие полям в CSV-файле. Таким образом, вы можете сделать что-то вроде этого '$ importedCsv1 | Где {$ csv1Field = $ _. Поле; ($ importedCsv2 | Где {$ _. FilterField -eq $ csv1Field}). Count -eq 0} ' –

+0

$ csv | Select-String -NotMatch $ исключений | Out-File $ hosts -Enc ascii работает, чтобы удалить все исключения из файла data.csv, но он оставляет пустую строку в верхней части для каждого совпадения, которое она удаляет. Есть идеи? – user2284702

3

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'} 
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, создавая новые объекты NoteProperty в obj, называя их из текущей строки в готовом виде до символа =, а значение остается оставшимся текст после символа =.

То, что я в конечном итоге это:

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 
+0

Решение, данное @ paul-rowland, получило бы этот результат более простым способом, используя фильтр '-notmatch'. Выясните, в каком столбце ваш текст вы хотите исключить (или совместить) - в моем примере «OSName» - это столбец, содержащий имена операционной системы, и я хочу исключить серверные ОС. Чтобы создать отфильтрованную таблицу с записями как PSCustomObjects, готовыми для дальнейшей обработки, импортируйте CSV, затем сделайте что-то вроде '$ filter = $ csv | где {$ _. OSName -notmatch 'Server'} ' – Trix