Наткнулся этот вопрос, пытаясь решить, как сделать то же самое себя.
То, что я придумал, как решение было следующим:
$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
Это на самом деле работает очень хорошо. Раньше у меня были подобные команды, но не указывал -Enc ascii, так что это игра мне нежелательных результатов. Вторая часть должна сравнить новый файл data.csv с другим списком csv, который имеет исключения, которые необходимо отфильтровать. Возможно, выработали вышеприведенную команду, возможно, я могу просто получить-содержимое списка исключений в массив и изменить «Не установлен» $ исключений? – user2284702
Если вы используете Import-Csv для загрузки файлов CSV, вы завершаете массив объектов, каждый из которых имеет свойства, соответствующие полям в CSV-файле. Таким образом, вы можете сделать что-то вроде этого '$ importedCsv1 | Где {$ csv1Field = $ _. Поле; ($ importedCsv2 | Где {$ _. FilterField -eq $ csv1Field}). Count -eq 0} ' –
$ csv | Select-String -NotMatch $ исключений | Out-File $ hosts -Enc ascii работает, чтобы удалить все исключения из файла data.csv, но он оставляет пустую строку в верхней части для каждого совпадения, которое она удаляет. Есть идеи? – user2284702