С большими наборами данных , * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} *1009* * * * * * * * * 100 * * *1009* * * * * * * * * * * * * * * * 100 * * *Кстати, данные обрабатываются строка за строкой , и в качестве бонуса вы можете использовать Select-Object
с вычисляемым свойством для выполнения преобразования вашего имени.
Тем не менее, если производительность имеет значение и , вы знаете, что вы можете разместить все данные в памяти одновременно , вы можете использоватьследующие (PSv4 +):
# Read the file in full into memory (transformed into objects).
$file = Import-Csv in.csv
# Modify the `.Name` property values of the in-memory object collection.
$file.ForEach({ $_.Name = $_.Name -creplace 'WindowsAuthServer @ |WIN' })
# Export the in-memory object collection back to a CSV file.
$file | Export-Csv -NoTypeInformation -Encoding Utf8 out.csv
Что касается то, что вы пытались :
$test = $file.Name -replace "WindowsAuthServer @ ",""
Этот оператор выполняет замену строк для всех .Name
значений свойств и возвращает преобразованные строки в виде новых строк (которые вы затем назначаете $test
).
Следовательно, ваш $file.Name
значения остаются без изменений .
Вместо этого необходимо явно обновить свойства .Name
.
Хотя может возникнуть соблазн сделать следующее,он не работает:
# !! Does NOT work if $file is an *array* of objects.
$file.Name = $file.Name -replace "WindowsAuthServer @ ",""
То есть, пока вы можете получить значения свойств массива объектов с простым доступом к свойству (.Name
)- функция под названием перечисление членов - настройка свойства, которые по дизайну не поддерживаются - см. эту проблему GitHub .
Вместо этого, помимо использования конвейера, как показано выше, у вас есть два варианта:
в PSv4 +, вы можете использовать метод сбора .Where()
, как также показано выше.
альтернативно (также работает в версиях с более низким PS), используйте петлю foreach
, как показано в ответ Ансгара Вичерса .