「テキストファイルの行数を簡単に数えたい」
「ログファイルが何行あるか確認したいけど、手動で数えるのは大変…」
「CSVデータの件数をパッと確認したい」
こんなふうに思ったことはありませんか?
そんな時に役立つのがWindows PowerShellです。わざわざ専用ソフトを入れなくても、Windowsに標準で入っているPowerShellを使えば、一瞬でファイルの行数をカウントできます。
この記事では、PowerShellを使ってファイルの行数をカウントする方法をわかりやすく解説します。コマンドをコピーしてすぐに試せるので、PowerShell初心者の方にもおすすめです。
PowerShellとは?基本を押さえよう
PowerShellって何?
PowerShellは、Windowsに標準搭載されているコマンドライン ツールです。
従来の方法:
- テキストエディタでファイルを開く
- 下にスクロールして行数を確認
- 大きなファイルだと時間がかかる…
PowerShellを使うと:
- コマンド一行で瞬時に行数を表示
- 複数ファイルも一括処理
- 自動化も簡単
PowerShellの起動方法
方法1:スタートメニューから
- Windowsキー を押す
- 「PowerShell」と入力
- 「Windows PowerShell」をクリック
方法2:検索から
- タスクバーの検索ボックスに「PowerShell」と入力
- 「Windows PowerShell」を選択
方法3:キーボードショートカット
Windows + R
→ powershell
と入力 → Enter
PowerShellの画面の見方
PowerShellを開くと、以下のような画面が表示されます:
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
PS C:\Users\YourName>
重要な部分:
PS
: PowerShellが動いている証拠C:\Users\YourName>
: 現在の作業フォルダ(カレントディレクトリ)
PowerShellで行数をカウントする基本方法
最もシンプルな方法
PowerShellでは、主に以下の方法で行数をカウントします:
Get-Content
コマンドレットを使ってファイルを読み込み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.
解決法:
- PowerShellを管理者権限で起動
- スタートメニューで「PowerShell」を右クリック
- 「管理者として実行」を選択
- ファイルの権限を確認
# ファイルの権限を表示 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を使えば、面倒な行数カウント作業が一瞬で終わります。
今回学んだ重要ポイント
- 基本コマンド:
(Get-Content ファイル名 | Measure-Object -Line).Lines
- 複数ファイル処理:
Get-ChildItem
とForEach-Object
の組み合わせ - エラー対処: ファイルパスや権限の確認
- パフォーマンス: 大容量ファイルは
ReadCount
や.NET
メソッド - 応用例: ログ監視、統計レポート、CSV出力
コメント