「データをCSV形式で保存したい」
「Excelに頼らずにデータ処理を自動化したい」
「PowerShellでCSVファイルを読み書きする方法が知りたい」
そんな疑問を解決するために、今回はPowerShellでCSVファイルを操作する方法について、初心者の方でも理解できるように詳しく説明していきます。
PowerShellでCSVを扱うメリット

CSVとは?
CSV(Comma-Separated Values)は、データをカンマで区切ったシンプルなテキストファイルです。
名前,年齢,職業,給与
田中太郎,30,エンジニア,500000
佐藤花子,28,デザイナー,450000
山田次郎,35,営業,400000
CSVファイルの特徴
CSVファイルの利点:
・軽量でファイルサイズが小さい
・Excelやその他のソフトで開ける
・プログラムで簡単に読み書きできる
・データベースとの相性が良い
・クロスプラットフォーム対応
PowerShellでCSVを使う理由
PowerShellの優位性:
・CSVファイルをオブジェクト形式で扱える
・データの抽出や加工が簡単
・スクリプトでの自動化に最適
・Windowsに標準搭載されている
・他のシステムとの連携が容易
PowerShellの基本準備
PowerShellの起動方法
- Windows キー + R を押す
- 「powershell」と入力してEnterキー
- または、スタートメニューから「Windows PowerShell」を検索
実行ポリシーの確認
初回利用時は実行ポリシーの設定が必要な場合があります:
# 現在の実行ポリシーを確認
Get-ExecutionPolicy
# 必要に応じて実行ポリシーを変更(管理者権限が必要)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
データをCSVファイルに保存する方法
基本的なCSV出力:Export-Csv
PowerShellでCSVファイルを作成する最も基本的な方法です。
# システム上で動作中のプロセス情報をCSVに保存
Get-Process | Select-Object Name, Id, CPU | Export-Csv -Path "process.csv" -NoTypeInformation -Encoding UTF8
コマンドの詳細説明
Get-Process # 実行中のプロセス一覧を取得
| Select-Object Name, Id, CPU # 必要な列だけを選択
| Export-Csv # CSV形式で出力
-Path "process.csv" # (パス+)ファイル名を指定
-NoTypeInformation # 型情報の行を除外
-Encoding UTF8 # 日本語対応のエンコーディング
カスタムデータの作成と保存
自分で作成したデータをCSVに保存する方法:
# 社員データを作成
$employees = @()
$employees += [PSCustomObject]@{
名前 = "田中太郎"
年齢 = 30
部署 = "開発部"
給与 = 500000
}
$employees += [PSCustomObject]@{
名前 = "佐藤花子"
部署 = "デザイン部"
年齢 = 28
給与 = 450000
}
$employees += [PSCustomObject]@{
名前 = "山田次郎"
年齢 = 35
部署 = "営業部"
給与 = 400000
}
# CSVファイルに保存
$employees | Export-Csv -Path "社員一覧.csv" -NoTypeInformation -Encoding UTF8
Write-Host "社員一覧.csvファイルを作成しました"
より高度なデータ作成例
# 複数の方法でデータを作成
$salesData = @()
# 方法1:個別に作成
$salesData += [PSCustomObject]@{
日付 = "2024-01-01"
商品名 = "商品A"
売上 = 150000
担当者 = "田中"
}
# 方法2:ループで一括作成
1..10 | ForEach-Object {
$salesData += [PSCustomObject]@{
日付 = (Get-Date).AddDays(-$_).ToString("yyyy-MM-dd")
商品名 = "商品$_"
売上 = Get-Random -Minimum 50000 -Maximum 200000
担当者 = @("田中", "佐藤", "山田")[(Get-Random -Maximum 3)]
}
}
# CSV出力
$salesData | Export-Csv -Path "売上データ.csv" -NoTypeInformation -Encoding UTF8
システム情報の出力例
# コンピューター情報をCSVに出力
$computerInfo = [PSCustomObject]@{
コンピューター名 = $env:COMPUTERNAME
ユーザー名 = $env:USERNAME
OS = (Get-WmiObject Win32_OperatingSystem).Caption
メモリ = [math]::Round((Get-WmiObject Win32_ComputerSystem).TotalPhysicalMemory / 1GB, 2)
CPU = (Get-WmiObject Win32_Processor).Name
取得日時 = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
}
$computerInfo | Export-Csv -Path "システム情報.csv" -NoTypeInformation -Encoding UTF8
CSVファイルを読み込む方法

基本的なCSV読み込み:Import-Csv
# CSVファイルを読み込み
$data = Import-Csv -Path "社員一覧.csv" -Encoding UTF8
# 内容を表示
$data | Format-Table
データの操作と加工
# 先ほど作成した社員データを読み込み
$employees = Import-Csv -Path "社員一覧.csv" -Encoding UTF8
# 全データを表形式で表示
Write-Host "=== 全社員一覧 ==="
$employees | Format-Table
# 特定の列だけを表示
Write-Host "=== 名前一覧 ==="
$employees | Select-Object 名前
# 条件でフィルタリング
Write-Host "=== 30歳以上の社員 ==="
$employees | Where-Object { [int]$_.年齢 -ge 30 }
# 給与順でソート
Write-Host "=== 給与順(高い順)==="
$employees | Sort-Object { [int]$_.給与 } -Descending
# 部署別にグループ化
Write-Host "=== 部署別集計 ==="
$employees | Group-Object 部署 | Select-Object Name, Count
より高度なデータ処理
# 売上データの分析例
$salesData = Import-Csv -Path "売上データ.csv" -Encoding UTF8
# 担当者別売上集計
$salesSummary = $salesData | Group-Object 担当者 | ForEach-Object {
[PSCustomObject]@{
担当者 = $_.Name
売上件数 = $_.Count
総売上 = ($_.Group | Measure-Object 売上 -Sum).Sum
平均売上 = [math]::Round(($_.Group | Measure-Object 売上 -Average).Average, 0)
}
}
# 集計結果をCSVに保存
$salesSummary | Export-Csv -Path "売上集計.csv" -NoTypeInformation -Encoding UTF8
# 結果表示
$salesSummary | Format-Table
CSVファイルの編集と更新
既存データの修正
# CSVファイルを読み込み
$employees = Import-Csv -Path "社員一覧.csv" -Encoding UTF8
# 特定の社員の情報を更新
$employees | ForEach-Object {
if ($_.名前 -eq "田中太郎") {
$_.給与 = "550000" # 昇給
$_.部署 = "管理部" # 異動
}
}
# 新しい社員を追加
$newEmployee = [PSCustomObject]@{
名前 = "鈴木一郎"
年齢 = "32"
部署 = "営業部"
給与 = "420000"
}
# 既存データに新しい社員を追加
$updatedEmployees = $employees + $newEmployee
# 更新されたデータを保存
$updatedEmployees | Export-Csv -Path "社員一覧_更新.csv" -NoTypeInformation -Encoding UTF8
データの検証と修正
# データの妥当性チェック
$employees = Import-Csv -Path "社員一覧.csv" -Encoding UTF8
$validatedEmployees = $employees | ForEach-Object {
# 年齢の妥当性チェック
if ([int]$_.年齢 -lt 18 -or [int]$_.年齢 -gt 65) {
Write-Warning "警告: $($_.名前)の年齢($($_.年齢))が範囲外です"
}
# 給与の妥当性チェック
if ([int]$_.給与 -lt 200000) {
Write-Warning "警告: $($_.名前)の給与($($_.給与))が最低賃金を下回っています"
}
# データを返す
$_
}
実践的な活用例
ログファイルの分析
# Webサーバーのアクセスログを分析(模擬データ)
$accessLogs = @()
# 模擬ログデータを作成
1..100 | ForEach-Object {
$accessLogs += [PSCustomObject]@{
日時 = (Get-Date).AddHours(-$_).ToString("yyyy-MM-dd HH:mm:ss")
IPアドレス = "192.168.1." + (Get-Random -Maximum 255)
ステータスコード = @(200, 404, 500)[(Get-Random -Maximum 3)]
ページ = @("/index.html", "/about.html", "/contact.html")[(Get-Random -Maximum 3)]
ユーザーエージェント = @("Chrome", "Firefox", "Safari")[(Get-Random -Maximum 3)]
}
}
# アクセスログをCSVに保存
$accessLogs | Export-Csv -Path "アクセスログ.csv" -NoTypeInformation -Encoding UTF8
# エラーページのアクセスのみを抽出
$errorLogs = $accessLogs | Where-Object { $_.ステータスコード -ne 200 }
$errorLogs | Export-Csv -Path "エラーログ.csv" -NoTypeInformation -Encoding UTF8
Write-Host "エラーページアクセス: $($errorLogs.Count)件"
在庫管理システム
# 在庫データの作成
$inventory = @()
$products = @("ノートPC", "マウス", "キーボード", "モニター", "プリンター")
foreach ($product in $products) {
$inventory += [PSCustomObject]@{
商品名 = $product
在庫数 = Get-Random -Minimum 5 -Maximum 50
単価 = Get-Random -Minimum 1000 -Maximum 100000
最終更新日 = (Get-Date).ToString("yyyy-MM-dd")
カテゴリ = "PC周辺機器"
}
}
# 在庫データをCSVに保存
$inventory | Export-Csv -Path "在庫管理.csv" -NoTypeInformation -Encoding UTF8
# 在庫が少ない商品(10個未満)をアラート
$lowStock = $inventory | Where-Object { [int]$_.在庫数 -lt 10 }
if ($lowStock) {
Write-Host "在庫不足の商品があります:" -ForegroundColor Red
$lowStock | Format-Table
$lowStock | Export-Csv -Path "在庫不足アラート.csv" -NoTypeInformation -Encoding UTF8
}
レポート生成の自動化
# 日次レポートの生成
function New-DailyReport {
$today = Get-Date -Format "yyyy-MM-dd"
# システム情報の取得
$systemInfo = [PSCustomObject]@{
日付 = $today
コンピューター名 = $env:COMPUTERNAME
CPU使用率 = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
メモリ使用率 = [math]::Round((Get-Counter "\Memory\% Committed Bytes In Use").CounterSamples.CookedValue, 2)
ディスク使用量 = [math]::Round((Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='C:'").Size / 1GB, 2)
空き容量 = [math]::Round((Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='C:'").FreeSpace / 1GB, 2)
}
# レポートをCSVに保存
$systemInfo | Export-Csv -Path "日次レポート_$today.csv" -NoTypeInformation -Encoding UTF8
Write-Host "日次レポートを生成しました: 日次レポート_$today.csv"
}
# レポート生成実行
New-DailyReport
トラブルシューティングとよくある問題
文字化け対策
# 文字化けを防ぐための設定
$OutputEncoding = [System.Text.Encoding]::UTF8
# CSVファイルの作成時は必ずエンコーディングを指定
$data | Export-Csv -Path "data.csv" -NoTypeInformation -Encoding UTF8
# BOM付きUTF-8で保存(Excelで開く場合)
$data | Export-Csv -Path "data.csv" -NoTypeInformation -Encoding UTF8BOM
パスの問題解決
# 現在の作業ディレクトリを確認
Get-Location
# フルパスを指定
$desktopPath = [Environment]::GetFolderPath("Desktop")
$csvPath = Join-Path $desktopPath "data.csv"
$data | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8
大量データの処理
# 大量データを分割して処理
function Export-LargeDataToCsv {
param(
[Parameter(Mandatory)]$Data,
[Parameter(Mandatory)]$BasePath,
[int]$ChunkSize = 1000
)
$chunks = for ($i = 0; $i -lt $Data.Count; $i += $ChunkSize) {
$end = [Math]::Min($i + $ChunkSize - 1, $Data.Count - 1)
, $Data[$i..$end]
}
for ($i = 0; $i -lt $chunks.Count; $i++) {
$fileName = $BasePath.Replace(".csv", "_part$($i + 1).csv")
$chunks[$i] | Export-Csv -Path $fileName -NoTypeInformation -Encoding UTF8
Write-Host "作成: $fileName ($(($chunks[$i]).Count) レコード)"
}
}
# 使用例
# Export-LargeDataToCsv -Data $largeDataSet -BasePath "大量データ.csv"
自動化とスケジューリング

バッチファイルでの実行
PowerShellスクリプトをバッチファイルから実行:
@echo off
powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\csv_export.ps1"
pause
タスクスケジューラとの連携
# PowerShellスクリプトファイル (csv_export.ps1)
param(
[string]$OutputPath = "C:\Reports"
)
# 出力ディレクトリの作成
if (!(Test-Path $OutputPath)) {
New-Item -ItemType Directory -Path $OutputPath -Force
}
# 日次レポートの生成
$today = Get-Date -Format "yyyyMMdd"
$reportPath = Join-Path $OutputPath "daily_report_$today.csv"
# システム情報の収集とCSV出力
Get-Process |
Select-Object Name, Id, CPU, WorkingSet |
Export-Csv -Path $reportPath -NoTypeInformation -Encoding UTF8
Write-Host "レポートを生成しました: $reportPath"
よくある質問
Q:CSVファイルをExcelで開くと文字化けします
A:-Encoding UTF8BOM
を使用するか、Excelでインポート時にエンコーディングを指定してください。
$data | Export-Csv -Path "data.csv" -NoTypeInformation -Encoding UTF8BOM
Q:カンマが含まれるデータはどう処理されますか?
A:PowerShellが自動的にダブルクォートで囲んで処理します。特別な対応は不要です。
Q:大量のデータを処理する時の注意点は?
A:メモリ使用量に注意し、必要に応じてデータを分割して処理してください。
Q:CSVファイルのヘッダー行を変更したい場合は?
A:Select-Objectで列名を変更するか、カスタムオブジェクトを作成してください。
$data | Select-Object @{Name="氏名";Expression={$_.Name}}, @{Name="年令";Expression={$_.Age}}
まとめ
PowerShellを使ったCSVファイルの操作は、業務自動化と効率化の強力な武器です。
おさらい:
- 基本操作:Export-CsvとImport-Csvでの読み書き
- データ作成:カスタムオブジェクトでの柔軟なデータ構築
- データ処理:フィルタリング、ソート、グループ化
- 実践応用:ログ分析、在庫管理、レポート生成
- トラブル対策:文字化け対策、大量データ処理
コメント