Belajar PowerShell - Working with CSV & Structured Data
Episode 10 of 31

Belajar PowerShell - Working with CSV & Structured Data

Bertukar data dengan format terstruktur: membaca dan menulis CSV dengan Import-Csv dan Export-Csv, bekerja dengan JSON melalui ConvertFrom-Json dan ConvertTo-Json untuk respons API, mengelola XML dengan XPath, hingga integrasi Excel lewat modul ImportExcel dan objek PSCustomObject.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

Di episode 9 kalian membaca dan menulis file teks polos. Tapi data dunia nyata jarang berbentuk teks acak — ia datang sebagai CSV, JSON, dan XML, format terstruktur yang dipahami sistem lain: spreadsheet, API, aplikasi, dan database. Episode 10 mengajarkan bahasa perantara ini.

Bayangkan CSV seperti meja spreadsheet, JSON seperti kartu identitas terstruktur yang dikirim API, dan XML seperti dokumen berlabel. Ketiganya punya tata cara sendiri, dan PowerShell memperlakukannya secara native — bukan dengan mengurai teks manual.

PSCustomObject: Objek Buatan Tangan

Sebelum menyimpan data, kalian perlu membuat objek sendiri. PSCustomObject adalah blok pembangun data terstruktur — satu pernyataan yang menciptakan objek dengan properti sesuai keinginan:

Membuat PSCustomObject
$server = [PSCustomObject]@{
    Name    = "web-01"
    Status  = "Running"
    Cores   = 4
}
$server.Name
$server | Select-Object Name, Status, Cores

Objek ini berperilaku persis seperti output cmdlet: bisa difilter Where-Object, diurutkan, dan diekspor. Ini adalah bahan baku untuk seluruh format di episode ini — banyak cmdlet file terstruktur yang menerima larik objek semacam ini.

CSV: Import-Csv dan Export-Csv

CSV menyimpan data tabular — baris dan kolom. Export-Csv menulis objek menjadi CSV, Import-Csv membacanya kembali:

Ekspor dan impor CSV
Get-Process pwsh | Select-Object ProcessName, Id, WS | Export-Csv /tmp/proses.csv
Import-Csv /tmp/proses.csv | Select-Object -First 3

Perhatikan: Export-Csv menulis teks, jadi data yang tersimpan adalah string. Setelah diimpor, angka bisa diubah kembali ke tipe aslinya — sering lewat ForEach-Object atau di titik penggunaan.

Header kolom disimpan di baris pertama. Saat file tanpa header (mentah dari sistem lain), beri tahu Import-Csv dengan -Header:

CSV tanpa header
Import-Csv /tmp/data-raw.csv -Header "nama", "usia", "kota"

Delimiter default adalah koma, tapi banyak sistem memakai titik koma atau tab. Tentukan dengan -Delimiter:

Delimiter khusus
Import-Csv /tmp/data.tsv -Delimiter "`t"
Import-Csv /tmp/data-semi.csv -Delimiter ";"

ConvertTo-Csv dan ConvertFrom-Csv bekerja pada string di memori, bukan file — berguna saat data ada di variabel, bukan di disk:

CSV di memori
$teks = Get-Process pwsh | ConvertTo-Csv
ConvertFrom-Csv $teks | Select-Object -First 2

JSON: ConvertFrom-Json dan ConvertTo-Json

JSON adalah format favorit API modern — ringkas, berstruktur, dan dipahami hampir semua bahasa. Konversi dua arahnya sederhana:

ConvertTo-Json dan ConvertFrom-Json
$data = [PSCustomObject]@{ Nama = "Arman"; Usia = 30; Skills = @("DevOps", "Cloud") }
$json = $data | ConvertTo-Json
$json
 
$kembali = $json | ConvertFrom-Json
$kembali.Nama
$kembali.Skills

Mengonsumsi respons API hanyalah dua langkah — ambil, lalu ubah jadi objek:

Respons API
$res = Invoke-RestMethod "https://api.example.com/users?limit=3"
$res | ForEach-Object { Write-Host "$($_.name) - $($_.email)" }

Invoke-RestMethod sudah otomatis mem-parse JSON menjadi objek. Ini salah satu alasan mengapa script integrasi API di PowerShell terasa mulus.

ConvertTo-Json punya parameter -Depth yang perlu diingat: nilai default 2, artinya objek bersarang lebih dalam dari dua level dipotong:

-Depth pada ConvertTo-Json
$kompleks = [PSCustomObject]@{ L1 = @{ L2 = @{ L3 = "dalam" } } }
$kompleks | ConvertTo-Json
$kompleks | ConvertTo-Json -Depth 4

Tanpa -Depth yang cukup, struktur terdalam menghilang senyap — salah satu bug JSON yang paling sering mengintai.

XML: [xml], Select-Xml, dan XPath

XML menyimpan data sebagai dokumen berlabel. Casting ke tipe [xml] mem-parse string atau file menjadi struktur yang bisa dinavigasi:

Mengurai XML
[xml]$doc = Get-Content /tmp/data.xml
$doc.books.book

Kode di atas mengakses elemen <books> lalu semua elemen <book> di dalamnya — navigasi seperti properti. Untuk pencarian berbasis XPath, gunakan Select-Xml:

Select-Xml dengan XPath
[xml]$doc = Get-Content /tmp/data.xml
Select-Xml -Xml $doc -XPath "//book[@kategori='devops']" |
    ForEach-Object { $_.Node.title }

XPath adalah bahasa penunjuk elemen: //book mengambil semua elemen book di kedalaman mana pun, dan atribut disaring dengan tanda kurung siku. Membuat atau mengubah XML dilakukan dengan manipulasi node — menambahkan elemen anak, mengubah teks, lalu menyimpan dengan Save:

Membuat dan mengubah XML
$doc = [xml]"<books></books>"
$book = $doc.CreateElement("book")
$book.SetAttribute("kategori", "devops")
$title = $doc.CreateElement("title")
$title.InnerText = "Belajar PowerShell"
$book.AppendChild($title) | Out-Null
$doc.DocumentElement.AppendChild($book) | Out-Null
$doc.Save("/tmp/buku.xml")

CreateElement, SetAttribute, AppendChild adalah API .NET yang dibungkus rapi oleh tipe [xml]. Konfirmasi hasilnya dengan membaca kembali $doc atau melihat file yang tersimpan.

Excel: COM dan Modul ImportExcel

Dua jalur menuju Excel:

  • COM — mengotomasi aplikasi Excel yang benar-benar terpasang, lewat objek New-Object -ComObject Excel.Application.
  • Modul ImportExcel — bekerja dengan file .xlsx tanpa Excel terpasang, murni dari PowerShell. Jauh lebih ringan dan cocok untuk server.
Menginstal ImportExcel
Install-Module ImportExcel -Scope CurrentUser
Menulis ke Excel tanpa Excel terpasang
$data = Get-Process pwsh | Select-Object ProcessName, Id, WS
$data | Export-Excel /tmp/proses.xlsx -WorksheetName "Proses" -AutoSize
$data | Import-Excel /tmp/proses.xlsx

Export-Excel dan Import-Excel memperlakukan file Excel seperti tabel biasa — ekspor objek ke lembar kerja, impor kembali menjadi objek. Untuk laporan yang harus dikirim ke orang lain (yang belum tentu punya PowerShell), ini jalur paling praktis.

Tip

Aturan memilih: API dan konfigurasi modern → JSON. Tabel yang dibuka di spreadsheet → CSV (paling universal). Dokumen berlabel atau konfigurasi lawas → XML. Laporan Excel resmi → ImportExcel. Jangan menempelkan JSON ke rekan yang hanya butuh tabel — pilih format yang paling pas untuk konsumen data.

Latihan Praktis

Script kecil yang mengambil status service, menyimpannya ke JSON dan CSV sekaligus:

simpan-status.ps1
$status = Get-Service | Select-Object Name, Status, StartType
 
$status | Export-Csv /tmp/status-service.csv -NoTypeInformation
$status | ConvertTo-Json -Depth 3 | Set-Content /tmp/status-service.json
 
$kembali = Import-Csv /tmp/status-service.csv
Write-Host "Total service tercatat: $($kembali.Count)"

-NoTypeInformation menghilangkan baris metadata tipe yang menempel di bagian atas CSV — sehingga file bersih dibaca sistem lain.

Penutup

Episode 10 membuka pertukaran data dengan dunia luar: PSCustomObject sebagai bahan baku objek buatan tangan; CSV dengan Import-Csv, Export-Csv, -Delimiter, -Header, dan pasangan in-memory ConvertTo-Csv/ConvertFrom-Csv; JSON dengan ConvertTo-Json, ConvertFrom-Json, dan parameter -Depth untuk respons API; XML dengan [xml], Select-Xml, dan XPath untuk navigasi dan modifikasi dokumen; serta Excel lewat COM dan modul ImportExcel tanpa perlu Excel terpasang.

Poin kunci yang dibawa pulang:

  • Pilih format sesuai konsumen data: JSON untuk API, CSV untuk tabel, XML untuk dokumen.
  • Invoke-RestMethod otomatis mem-parse JSON.
  • -Depth default 2 bisa memotong JSON bersarang — perbesar saat perlu.
  • ImportExcel memungkinkan file .xlsx tanpa Excel terpasang.
  • Selalu sediakan header yang jelas; -NoTypeInformation menjaga CSV tetap bersih.

Struktur data menangani data yang teratur — tapi dunia nyata penuh teks yang tidak teratur: log, pesan, dan input pengguna. Di episode 11 kita memanggil senjata penyaring teks terkuat: regular expressions — pola yang mengenali, memvalidasi, dan mengekstrak dari teks bebas. Sampai jumpa di episode 11!

Belajar PowerShell - Working with CSV & Structured Data | Belajar PowerShell