Редактирование столбца в CSV - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть CSV, который содержит более 24 000 имен серверов, а также другую информацию.Столбцы CSV: Name, Group и Target.Пример необработанных данных для столбца «Имя»:

WindowsAuthServer @ wddg9028WIN

Я пытаюсь найти способ отредактировать столбец Name в CSV.Мне нужно удалить WindowsAuthServer @ и WIN из имен серверов.Единственное, что я хочу оставить - это имя сервера или wddg9028 для этого примера.Потенциальная проблема заключается в том, что не каждое имя сервера имеет этот формат, а некоторые содержат только имя сервера.Очевидно, что те, которые уже верны, не нужно менять, но я не уверен, что это скинет все.

Я попытался сделать:

$test = $file.Name -replace "WindowsAuthServer @ ",""

Это возвращаетназывает точно, как я хочу их (минус удаление WIN).Однако всякий раз, когда я делаю это, я теряю все остальные столбцы из CSV.

Есть ли способ отредактировать один столбец в CSV?Должно ли это быть сделано во время чтения данных для этого случая?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Импорт CSV.Обработайте строки в цикле, заменяя текущее значение рассматриваемого поля измененным значением.Экспортируйте данные обратно в файл CSV.

$csv = Import-Csv 'C:\path\to\input.csv'

foreach ($row in $csv) {
    $row.Name = $row.Name -replace 'WindowsAuthServer @ '
}

$csv | Export-Csv 'C:\path\to\output.csv' -NoType

Это как минимум третий вопрос по этому вопросу.Пожалуйста, найдите руководство по PowerShell.Это действительно базовый материал.

0 голосов
/ 18 декабря 2018

С большими наборами данных , * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} *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, как показано в ответ Ансгара Вичерса .

...