Windows PowerShellで行数をカウントする方法|初心者でもすぐわかる便利テク

Windows

「テキストファイルの行数を簡単に数えたい」
「ログファイルが何行あるか確認したいけど、手動で数えるのは大変…」
「CSVデータの件数をパッと確認したい」

こんなふうに思ったことはありませんか?

そんな時に役立つのがWindows PowerShellです。わざわざ専用ソフトを入れなくても、Windowsに標準で入っているPowerShellを使えば、一瞬でファイルの行数をカウントできます。

この記事では、PowerShellを使ってファイルの行数をカウントする方法をわかりやすく解説します。コマンドをコピーしてすぐに試せるので、PowerShell初心者の方にもおすすめです。

スポンサーリンク

PowerShellとは?基本を押さえよう

PowerShellって何?

PowerShellは、Windowsに標準搭載されているコマンドライン ツールです。

従来の方法:

  • テキストエディタでファイルを開く
  • 下にスクロールして行数を確認
  • 大きなファイルだと時間がかかる…

PowerShellを使うと:

  • コマンド一行で瞬時に行数を表示
  • 複数ファイルも一括処理
  • 自動化も簡単

PowerShellの起動方法

方法1:スタートメニューから

  1. Windowsキー を押す
  2. 「PowerShell」と入力
  3. 「Windows PowerShell」をクリック

方法2:検索から

  1. タスクバーの検索ボックスに「PowerShell」と入力
  2. 「Windows PowerShell」を選択

方法3:キーボードショートカット

Windows + Rpowershell と入力 → Enter

PowerShellの画面の見方

PowerShellを開くと、以下のような画面が表示されます:

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users\YourName>

重要な部分:

  • PS : PowerShellが動いている証拠
  • C:\Users\YourName> : 現在の作業フォルダ(カレントディレクトリ)

PowerShellで行数をカウントする基本方法

最もシンプルな方法

PowerShellでは、主に以下の方法で行数をカウントします:

  1. Get-Content コマンドレットを使ってファイルを読み込み
  2. Measure-Object コマンドレットで行数を計測

とてもシンプルです!

基本コマンドの構文

(Get-Content ファイル名 | Measure-Object -Line).Lines

実際のコマンド例

例えば sample.txt というテキストファイルの行数を数えたい場合:

(Get-Content sample.txt | Measure-Object -Line).Lines

実行結果:

120

これでsample.txtが120行だとわかります。

コマンドの仕組みを詳しく解説

各部分の役割

部分役割
Get-Content sample.txtファイルを行単位で読み込む
|パイプ(前の結果を次のコマンドに渡す)
Measure-Object -Line行数を計測する
().Lines結果のうち、行数だけを取り出す

詳細な処理の流れ

# 1. ファイルの内容を取得
Get-Content sample.txt

# 2. 行数を測定(詳細情報も含む)
Get-Content sample.txt | Measure-Object -Line

# 3. 行数のみを抽出
(Get-Content sample.txt | Measure-Object -Line).Lines

Measure-Object -Lineの出力例:

Count    : 120
Average  :
Sum      :
Maximum  :
Minimum  :
Property :
Lines    : 120
Words    : 0
Characters : 0

.Linesを付けることで、120という数値だけが表示されます。

ファイルパスの指定方法

相対パスと絶対パス

相対パス(現在のフォルダからの位置):

# 同じフォルダのファイル
(Get-Content sample.txt | Measure-Object -Line).Lines

# サブフォルダのファイル
(Get-Content data\log.txt | Measure-Object -Line).Lines

# 親フォルダのファイル
(Get-Content ..\readme.txt | Measure-Object -Line).Lines

絶対パス(完全なパス):

# Cドライブの特定の場所
(Get-Content "C:\Users\Username\Documents\data.txt" | Measure-Object -Line).Lines

# ネットワークドライブ
(Get-Content "\\server\share\file.txt" | Measure-Object -Line).Lines

スペースを含むパスの場合

# ダブルクォーテーションで囲む
(Get-Content "C:\My Documents\sample file.txt" | Measure-Object -Line).Lines

応用テクニック:複数ファイルの一括処理

フォルダ内の複数ファイルを一括カウント

特定の拡張子のファイルをすべてカウント

# .logファイルをすべてカウント
Get-ChildItem *.log | ForEach-Object {
    $lines = (Get-Content $_.FullName | Measure-Object -Line).Lines
    "$($_.Name) : $lines 行"
}

実行結果例:

access.log : 1,245 行
error.log : 89 行
system.log : 567 行

より見やすい表形式で表示

Get-ChildItem *.txt | ForEach-Object {
    [PSCustomObject]@{
        ファイル名 = $_.Name
        行数 = (Get-Content $_.FullName | Measure-Object -Line).Lines
        サイズ = "{0:N2} KB" -f ($_.Length / 1KB)
    }
} | Format-Table -AutoSize

実行結果例:

ファイル名    行数  サイズ
----------   ----  -------
readme.txt    120   15.23 KB
data.txt      890   45.67 KB
notes.txt      45    2.34 KB

サブフォルダも含めて再帰的に検索

# すべてのサブフォルダの.csvファイルをカウント
Get-ChildItem -Recurse *.csv | ForEach-Object {
    $lines = (Get-Content $_.FullName | Measure-Object -Line).Lines
    "$($_.DirectoryName)\$($_.Name) : $lines 行"
}

結果をCSVファイルに出力

# 結果をCSVファイルに保存
Get-ChildItem *.txt | ForEach-Object {
    [PSCustomObject]@{
        ファイル名 = $_.Name
        行数 = (Get-Content $_.FullName | Measure-Object -Line).Lines
        作成日 = $_.CreationTime
        更新日 = $_.LastWriteTime
    }
} | Export-Csv -Path "ファイル行数一覧.csv" -Encoding UTF8 -NoTypeInformation

実用的な応用例

ログファイルの監視

日次ログの行数変化をチェック

# 過去7日間のログファイル行数をチェック
$today = Get-Date
for ($i = 0; $i -lt 7; $i++) {
    $date = $today.AddDays(-$i).ToString("yyyy-MM-dd")
    $filename = "log_$date.txt"
    
    if (Test-Path $filename) {
        $lines = (Get-Content $filename | Measure-Object -Line).Lines
        "$date : $lines 行"
    } else {
        "$date : ファイルなし"
    }
}

CSVデータの件数確認

# CSVファイルのデータ件数(ヘッダー行を除く)
$totalLines = (Get-Content data.csv | Measure-Object -Line).Lines
$dataLines = $totalLines - 1
"データ件数: $dataLines 件(ヘッダー除く)"

大容量ファイルの効率的な行数カウント

# 大きなファイルの場合、メモリを節約しながらカウント
function Count-LinesEfficient {
    param([string]$FilePath)
    
    $count = 0
    $reader = [System.IO.File]::OpenText($FilePath)
    
    try {
        while ($reader.ReadLine() -ne $null) {
            $count++
        }
    }
    finally {
        $reader.Close()
    }
    
    return $count
}

# 使用例
Count-LinesEfficient "大容量ファイル.txt"

トラブルシューティング:よくあるエラーと解決法

エラー1:ファイルが見つからない

Get-Content : Cannot find path 'C:\path\to\file.txt'

原因と解決法:

原因解決法
ファイルパスが間違っているTest-Pathでファイルの存在確認
ファイル名の誤字・脱字ファイル名を再確認
全角文字が混入半角文字で入力し直す

ファイル存在確認の方法:

# ファイルが存在するかチェック
if (Test-Path "sample.txt") {
    "ファイルが存在します"
} else {
    "ファイルが見つかりません"
}

# 現在のフォルダのファイル一覧を表示
Get-ChildItem

エラー2:アクセスが拒否される

Get-Content : Access to the path 'C:\Windows\System32\file.txt' is denied.

解決法:

  1. PowerShellを管理者権限で起動
    • スタートメニューで「PowerShell」を右クリック
    • 「管理者として実行」を選択
  2. ファイルの権限を確認 # ファイルの権限を表示 Get-Acl "ファイル名" | Format-List

エラー3:文字エンコーディングの問題

# 日本語ファイルで文字化けが発生する場合
Get-Content -Path "日本語ファイル.txt" -Encoding UTF8 | Measure-Object -Line

エンコーディングの指定:

# UTF-8
Get-Content -Path "file.txt" -Encoding UTF8

# Shift_JIS
Get-Content -Path "file.txt" -Encoding Default

# Unicode
Get-Content -Path "file.txt" -Encoding Unicode

エラー4:メモリ不足(大容量ファイル)

大容量ファイルの場合、メモリ不足でエラーになることがあります。

解決法:

# ストリーミング読み込みで行数カウント
function Count-LinesStream {
    param([string]$Path)
    
    $count = 0
    Get-Content $Path -ReadCount 1000 | ForEach-Object {
        $count += $_.Count
    }
    return $count
}

パフォーマンスの最適化

処理速度の比較

方法適用場面速度
Get-Content | Measure-Object小〜中規模ファイル普通
ReadCount指定大容量ファイル高速
.NETメソッド直接使用超大容量ファイル最高速

高速化のテクニック

ReadCountを使用した最適化

# 1000行ずつ読み込んで処理
(Get-Content large_file.txt -ReadCount 1000 | Measure-Object).Count

.NETメソッドを直接使用

# 最高速の行数カウント
[System.IO.File]::ReadAllLines("ファイル名").Count

便利なスクリプト例

ディレクトリ内のファイル統計

# フォルダ内のテキストファイル統計
$stats = Get-ChildItem *.txt | ForEach-Object {
    [PSCustomObject]@{
        ファイル名 = $_.Name
        行数 = (Get-Content $_.FullName | Measure-Object -Line).Lines
        文字数 = (Get-Content $_.FullName | Measure-Object -Character).Characters
        単語数 = (Get-Content $_.FullName | Measure-Object -Word).Words
        サイズ = $_.Length
    }
}

# 統計表示
$stats | Format-Table -AutoSize
"合計行数: $(($stats | Measure-Object -Property 行数 -Sum).Sum)"
"平均行数: $(($stats | Measure-Object -Property 行数 -Average).Average)"

ログファイルの日次レポート

# 日次ログレポート生成
$date = Get-Date -Format "yyyy-MM-dd"
$logFiles = Get-ChildItem "*$date*.log"

$report = @"
=== ログファイル行数レポート ($date) ===

"@

foreach ($file in $logFiles) {
    $lines = (Get-Content $file.FullName | Measure-Object -Line).Lines
    $report += "$($file.Name): $lines 行`n"
}

$report += "`n合計ファイル数: $($logFiles.Count)"
$report | Out-File "ログレポート_$date.txt" -Encoding UTF8

Write-Host $report

よくある質問と回答

空行も含めてカウントされる?

はい、空行も1行としてカウントされます。

# 空行を除いた行数をカウントしたい場合
(Get-Content sample.txt | Where-Object {$_.Trim() -ne ""} | Measure-Object).Count

巨大ファイルでもちゃんと動く?

基本的には動きますが、メモリ不足になる可能性があります。

対策:

# 大容量ファイル用の効率的なカウント
$count = 0
Get-Content huge_file.txt -ReadCount 1000 | ForEach-Object {
    $count += $_.Length
}
$count

結果を変数に保存したい場合は?

# 結果を変数に保存
$lineCount = (Get-Content sample.txt | Measure-Object -Line).Lines
Write-Host "ファイルの行数は $lineCount 行です"

# 複数の情報を保存
$fileInfo = Get-Content sample.txt | Measure-Object -Line -Word -Character
"行数: $($fileInfo.Lines)"
"単語数: $($fileInfo.Words)" 
"文字数: $($fileInfo.Characters)"

バッチファイルから呼び出せる?

@echo off
powershell -Command "(Get-Content sample.txt | Measure-Object -Line).Lines"
pause

まとめ:PowerShellで効率的なファイル管理を実現しよう

Windows PowerShellを使えば、面倒な行数カウント作業が一瞬で終わります。

今回学んだ重要ポイント

  1. 基本コマンド: (Get-Content ファイル名 | Measure-Object -Line).Lines
  2. 複数ファイル処理: Get-ChildItemForEach-Objectの組み合わせ
  3. エラー対処: ファイルパスや権限の確認
  4. パフォーマンス: 大容量ファイルはReadCount.NETメソッド
  5. 応用例: ログ監視、統計レポート、CSV出力

コメント

タイトルとURLをコピーしました