Імпорт та експорт файлів CSV та XML у PowerShell, Windows IT Pro
Використання PowerShell для імпорту та експорту структурованих даних
Однак простий рядковий аналіз тексту дає збій у тому випадку, якщо вам потрібно обробити структуровані дані. Наприклад, файли CSV є надзвичайно поширеним форматом обміну даними. Я не можу навіть порахувати, скільки разів бачив в онлайн-форумах питання: «як мені прочитати дані, що вводяться з файлу формату CSV, використовуючи пакетний файл (тобто набір команд оболонки Cmd.exe)»? Можливо вам довелося робити весь аналіз вручну, а це вкрай складно. Наприклад, якщо рядок даних містить спеціальні символи, такі як , ви не зможете виконати аналіз. Аналіз файлів XML за допомогою Cmd.exe навіть складніший. Якщо не сказати неможливо.
Windows PowerShell справляється зі згаданими вище труднощами, надаючи рядок команд для імпорту та експорту структурованих даних. Всі ці команди містять у назві або слово CSV, або слово XML, тому ви можете отримати їх список, ввівши наступну команду в рядку PowerShell:
Коли ви запускаєте цю команду, ви бачите список усіх команд у сесії PowerShell, які містять у назві або слова CSV та XML, або якісь додаткові імена. Я розповім про команди, які містять дієслова Export та Import.
Імпорт файлів CSV
Як говорилося вище, CSV – це дуже поширений формат обміну даними. файл CSV є відкритим текстовим файлом, який є таблицею даних. Кожен рядок файлу – це один запис (рядок) даних. Перший рядок файлу зазвичай (хоч і не завжди) визначає імена полів (стовпців). Елементи даних у кожному рядку розділені символом роздільника. Як роздільник частовикористовується кома (особливо коли справа стосується текстових даних), тому елементи даних у CSV-файлі зазвичай укладені в подвійні лапки («) або в будь-які інші символи. У таблиці наведено приклад таблиці даних.

На екрані 1 показано, як ці дані будуть представлені у CSV файлі.
Import-Csv читає файл CSV і виводить список об'єктів PowerShell для користувача: один для кожного рядка введених даних. PowerShell сприймає перший рядок файлу CSV як властивості об'єкта, а наступні рядки файлу є об'єктами, що виводяться. Наприклад, якщо ви запускаєте команду Import-Csv Sample.csv, PowerShell виведе три об'єкти з двома властивостями для кожного: DisplayName і Mail, як показано на екрані 2.

Якщо файл CSV, який ви хочете імпортувати, не має рядка заголовка, ви можете використовувати параметр –Header для найменування властивостей об'єкта. Таким чином, якщо б у Sample1.csv був відсутній перший рядок (заголовок), ви б використовували команду, наприклад:
Import-Csv використовує символ коми, оскільки це роздільник за промовчанням, але ви можете застосувати параметр –Delimiter для визначення іншого символу для роздільника. Наприклад, якби Sample.csv використовував символ «табуляції» як роздільник, ви вводили б таку команду:
Оскільки Import-Csv виводить об'єкти PowerShell, ви можете використовувати інші команди PowerShell для обробки об'єктів. Наприклад, припустимо, що ви хочете розсортувати дані, що виводяться за критерієм DisplayName, але вам потрібно тільки властивість Mail для кожного об'єкта. Щоб це зробити, ви використовуєте команди Sort-Object та Select-Object:
Також ви можете передати ці об'єкти команді ForEach-Object для обробки:
Ця команда використовує символ fдля виведення форматованого рядка для кожного об'єкта і виводить дані, показаний на екрані 3.
Експорт файлів CSV
Іноді буває необхідно створити файл CSV з даних об'єктів PowerShell, що виводяться. Щоб це зробити, ви використовуєте конвеєр PowerShell для направлення даних команді Export-Csv та вказуєте ім'я файлу. PowerShell запише дані об'єктів у файл CSV. Це просто, але є одна маленька хитрість. За промовчанням Export-Csv пише рядок, що починається з символів #TYPE, як перший рядок файлу CSV. Параметр –NoTypeInformation у Export-Csv опускає цей додатковий рядок під час виведення даних, тому зазвичай вказую цей параметр.
Припустимо, ви хочете створити копію Sample.csv, сортуючи його за якістю DisplayName. Все, що вам потрібно, це імпортувати файл, відправити його контент у команду Sort-Object, а потім експортувати контент у новий файл CSV:
Зауважте, що Export-Csv може виводити дані будь-яких об'єктів PowerShell, а не тільки об'єктів, створених за допомогою Import-Csv. Наприклад, погляньте на таку команду:
Ця команда створює файл CSV, який містить у поточній папці файли, відсортовані за критерієм розміру. Ця команда використовує Select-Object для вибору повного файлового імені кожного файлу, часу останньої зміни та розміру файлу (довжини). Таким чином, ці три властивості будуть стовпцями у файлі CSV.
Імпорт файлів XML
XML є іншим типом текстового файлу, який зберігає структуровані дані. У лістингу 1 наведено приклад подання XML даних з таблиці.
Дані у документі XML організовані в ієрархічному порядку. У Sample.xml (листинг 1) у вас є кореневий елемент () і три дочірні елементи (). Елементирозташовуються в парах та містять інші елементи. Відкриваючий елемент використовує кутові дужки навколо свого імені, а елемент, що закриває, використовує косу межу перед ім'ям елемента. Коли ви працюєте з даними XML PowerShell, ви повинні мати єдиний кореневий елемент. Інші елементи містяться усередині кореневого елемента.
PowerShell має команду Import-Clixml, але Import-Clixml не може імпортувати Sample.xml, тому що Sample.xml не повністю відповідає формату, який вимагає cmdlet. Замість нього можна використовувати Get-Content cmdlet та додатковий тип забезпечення [Xml]: $Data = [Xml] (Get-Content Sample.xml).
Після введення команди змінна $Data містить об'єкт XmlDocument. Об'єкт XmlDocument включає дві властивості: xml (елемент у верхній частині файлу) та базу даних (кореневий елемент). Ви можете вивести дані з файлу XML так:
Ця команда робить такий самий виведення даних, як показано на екрані 2: виводить дані трьох об'єктів з двома властивостями для кожного (DisplayName і Mail).
Якщо дані XML-файлу, який ви хочете імпортувати, були збережені Export-Clixml, вам не потрібен додатковий акселератор типу [Xml] та команда Get-Content. Замість них можна використовувати Import-Clixml, про що я розповім у наступному розділі.
Експорт файлів XML
Ви можете експортувати об'єкт XmlDocument у файл за допомогою Export-Clixml. Як і Export-Csv команда Export-Clixml вимагає ім'я файлу. Розглянемо такі команди:
Перша команда імпортує Sample.xml (листинг 1) як об'єкт XmlDocument. Друга команда експортує об'єкт XmlDocument у Data.xml.
Import-Clixml протилежний Export-Clixml. Import-Clixml повертає файл XML, який був експортований Export-Clixml як об'єктXmlDocument. Наприклад, у наступній команді Import-Clixml повертає Data.xml:
Після запуску цієї команди змінна $Data2 містить копію того самого об'єкта XmlDocument, який зберігається в $Data.
Пам'ятайте, що ви можете використовувати команду Import-Clixml для імпорту лише файлу XML, створеного Export-Clixml. Це пов'язано з тим, що XML-файл повинен містити специфічний набір елементів, щоб Import-Clixml могла імпортувати його. Якщо файл XML не в потрібному форматі, вам необхідно використовувати додатковий акселератор типу [Xml] та Get-Content, про що йшлося у попередньому розділі.
Керуйте файлами CVS та XML
Текстові файли CSV і XML є популярними форматами для обміну даними. Творці PowerShell надали нам кілька дуже потужних і простих у використанні команд, які допомагають імпортувати та експортувати файли в обидва формати. Аналіз файлів CSV і XML, що виконується вручну, залишився в минулому.