Поиск по сайту:

Как использовать Import-CSV в PowerShell


Работая с PowerShell, мы можем использовать файлы CSV для импорта данных в системы или для использования их в качестве справочного списка, например, пользователей, чтобы обновить или получить настройки. Для этого мы используем функцию Import-CSV в PowerShell.

Функция Import-CSV преобразует данные CSV в пользовательский объект в PowerShell. Таким образом, мы можем легко пройтись по каждой строке файла CSV и использовать данные в наших скриптах.

В этой статье мы рассмотрим, как читать CSV файл с помощью PowerShell, используя функцию Import-CSV, а также как читать каждую строку с помощью команды foreach. Я также дам вам несколько советов о том, как использовать функцию Import CSV.

Импорт-CSV в PowerShell

Командлет Import-CSV довольно прост и имеет всего несколько полезных свойств:

  • Путь - (Обязательно) Местоположение CSV файла
  • Разделитель – По умолчанию запятая, но это позволяет вам изменить его
  • Заголовок – Позволяет определять пользовательские заголовки для столбцов. Используется как имена свойств
  • UseCulture – Используйте разделитель по умолчанию вашего устройства
  • Кодировка – Укажите кодировку импортируемого файла CSV

Мы начнем с простого списка пользователей, который мы можем импортировать в PowerShell. Я создал следующий CSV-файл, который использую в следующих примерах:

UserPrincipalName,"DisplayName","Title","UserType","IsLicensed"
LeeG@lazydev.com,"Lee Gu","jr engineer","Member","True"
MeganB@lazydev.com,"Megan Bowen","recruiter","Member","True"
GradyA@lazydev.com,"Grady Archie","sr engineer","Member","True"
MiriamG@lazydev.com,"Miriam Graham","Director","Member","True"
openmailbox@lazydev.com,"openmailbox",,"Member","False"
JohannaL@lazydev.com,"Johanna Lorenz","Senior Engineer","Member","True"
JoniS@lazydev.com,"Joni Sherman","recruiter","Member","False"
AlexW@lazydev.com,"Alex Wilber","Marketing Assistant","Member","True"
IsaiahL@lazydev.com,"Isaiah Langer","Sales Rep","Member","True"

Этот CSV файл уже имел заголовки для каждого столбца, поэтому нам не нужно беспокоиться об этом пока. Чтобы импортировать этот CSV файл в PowerShell, мы можем просто использовать следующую команду:

Import-CSV -Path c:\temp\test.csv | ft

В этом случае мы не сохраняем результаты в переменной, а сразу выводим их в таблицу с помощью ft. Как видите, теперь у нас есть все наши пользователи со всеми колонками аккуратно в PowerShell.

Если вы сохраните результаты командлета импорта в переменной, вы сможете обращаться к каждому столбцу как к свойству, используя имя столбца (заголовок):

$users = Import-Csv -Path c:\temp\test.csv
$users.DisplayName

Указание разделителя

Распространенная проблема при импорте CSV файла с помощью PowerShell заключается в том, что разделитель не распознается. По умолчанию команда Import-CSV использует , в качестве разделителя. Но здесь, в Нидерландах, например, по умолчанию в Excel для CSV файлов используется ;.

Итак, когда я создаю CSV-файл в Excel, который хочу использовать в PowerShell, мне нужно будет либо изменить разделитель в CSV-файле, либо указать правильный разделитель в PowerShell. Для этого есть два варианта.

Мы можем использовать параметр -delimiter для указания правильного разделителя:

$users = Import-Csv -Path c:\temp\test.csv -Delimiter ;

Или используйте разделитель по умолчанию системы с параметром -UseCulture:

$users = Import-Csv -Path c:\temp\test.csv -UseCulture

Если вы хотите узнать, какой разделитель по умолчанию на вашем компьютере, вы можете использовать следующую команду PowerShell для получения информации о культуре:

(Get-Culture).TextInfo.ListSeparator

Импорт CSV в PowerShell для каждого

Большую часть времени, когда вы импортируете CSV файл в PowerShell, вы хотите пройтись по каждой строке CSV файла. Например, чтобы получить разрешения на почтовый ящик или размер папки OneDrive.

Для этого мы можем объединить командлет Import CSV с ForEach. Внутри блока ForEach мы можем ссылаться на каждый столбец файла CSV как на свойство объекта пользователя в данном случае.

Взяв пример файла CSV, который я добавил в начале статьи, мы можем получить почтовый ящик каждого пользователя, используя UserPrincipalName следующим образом:

Import-CSV -Path C:\temp\test.csv | ForEach {
    # Get mailbox of each user
    Get-ExoMailbox -identity $_.UserPrincipalName
}

Для этого ваш CSV файл должен иметь заголовки. Однако это не всегда так, иногда CSV файлы содержат только значения и вообще не имеют заголовков.

Чтобы по-прежнему можно было ссылаться на каждое значение в файле CSV, вам необходимо добавить заголовки к команде Import-CSV.

Добавление заголовков к Import-CSV

Давайте возьмем следующий CSV-файл с именами серверов и IP-адресами серверов:

la-ams-ad01,10.15.0.1
la-ams-file02,10.15.0.3
la-ams-db01,10.15.0.4
la-osl-ad01,10.12.0.1
la-osl-file01,10.12.0.5

Как вы можете видеть, этот CSV файл не имеет заголовков (имен столбцов). Поэтому, когда мы импортируем этот CSV файл напрямую в PowerShell, вы увидите, что первая строка используется в качестве заголовка. Это не сработает.

Итак, что нам нужно сделать, это определить заголовки для CSV файла. Нам нужно перечислить все заголовки в строке, разделенной запятыми, заключив каждое имя заголовка в одинарные кавычки.

Import-Csv -Path c:\temp\server.csv -Header 'ServerName','IpAddress'

Важно знать, что если вы не указываете все заголовки, оставшиеся столбцы не импортируются. Поэтому, если мы расширим наш CSV-файл следующими столбцами:

la-ams-ad01,10.15.0.1,HP,DL365 G10
la-ams-file02,10.15.0.3,HP,DL380 G9
la-ams-db01,10.15.0.4,HP,DL385 G10
la-osl-ad01,10.12.0.1,HP,DL110 G8
la-osl-file01,10.12.0.5,HP,DL345 G10

И просто укажите три заголовка столбцов, тогда последний столбец, модель сервера в этом случае, не будет импортирован:

Import-Csv -Path c:\temp\server.csv -Header 'ServerName','Ip','Brand'

Result:
ServerName    Ip        Brand
----------    --        -----
la-ams-ad01   10.15.0.1 HP
la-ams-file02 10.15.0.3 HP
la-ams-db01   10.15.0.4 HP
la-osl-ad01   10.12.0.1 HP
la-osl-file01 10.12.0.5 HP

Если вы определите больше заголовков, чем столбцов, то для каждого объекта создается дополнительное пустое свойство. Это может быть полезно, если вы хотите создать объект с дополнительными полями, которые вы хотите заполнить позже. Например, если вы хотите узнать дисковое пространство каждого сервера, мы можем уже добавить столбец дискового пространства в импортируемые данные:

Import-Csv -Path c:\temp\server.csv -Header 'ServerName','Ip','Brand','Model','DiskSpace' | ft

Result
ServerName    Ip        Brand Model     DiskSpace
----------    --        ----- -----     ---------
la-ams-ad01   10.15.0.1 HP    DL365 G10
la-ams-file02 10.15.0.3 HP    DL380 G9
la-ams-db01   10.15.0.4 HP    DL385 G10
la-osl-ad01   10.12.0.1 HP    DL110 G8
la-osl-file01 10.12.0.5 HP    DL345 G10

Это позволяет нам делать следующее, например:

$servers = Import-Csv -Path c:\temp\server.csv -Header 'ServerName','Ip','Brand','Model','DiskSpace'

$servers | ForEach {
    $_.DiskSpace = Invoke-Command -ComputerName $_.ServerName {Get-PSDrive C} | Select-Object Free
}

Как импортировать только определенные поля с помощью Import-CSV

Когда вы импортируете CSV-файл в PowerShell, по умолчанию будут импортированы все столбцы. Но при работе с большими файлами может быть полезно выбрать только те данные, которые вам действительно нужны.

Существует два способа сделать это. Если ваш файл CSV имеет заголовки, вы можете выбрать только нужный вам столбец:

Import-Csv -Path c:\temp\test.csv | select DisplayName,Title | Ft

Другой вариант - использовать параметр -header, но это работает хорошо только в том случае, если вам нужна только первая колонка (или первые несколько колонок). Поскольку вы не можете пропустить колонку с помощью этого метода:

Import-Csv -Path c:\temp\test.csv -Header id

Result
id
--
UserPrincipalName
LeeG@lazydev.com
MeganB@lazydev.com
GradyA@lazydev.com
MiriamG@lazydev.com
openmailbox@lazydev.com
JohannaL@lazydev.com
JoniS@lazydev.com
AlexW@lazydev.com
IsaiahL@lazydev.com

Найдите значения в CSV файле

Иногда вы просто хотите найти конкретное значение или столбец в файле CSV. Для этого вам нужно знать названия столбцов. Мы можем импортировать файл CSV, а затем выбрать только те записи, где столбец соответствует заданной строке. Затем вы можете вернуть либо всю строку, либо конкретный столбец:

$csv = Import-CSV -path c:\temp\test.csv
$csv | Where-Object {$_.UserPrincipalName -eq 'AlexW@lazydev.com'} | Select Title

Result
Title
-----
Marketing Assistant

Заключение

Команда Import-CSV в PowerShell действительно полезна, когда вам нужно работать со списками или хотите искать несколько сущностей. Убедитесь, что вы проверили, содержит ли CSV-файл заголовки и используете ли вы правильный разделитель.

Если у вас есть вопросы, просто оставьте комментарий ниже.