none
スクリプト内でサイズの大きなファイルの行数を取得する方法 RRS feed

  • 質問

  • Windowsでファイルの行数をスクリプトから取得致したく、質問させてください。
    サイズの小さなファイルの場合は動作上に全く問題が無いのですが、大きなサイズのファイルの場合(250万行ほど)
    使用メモリが100%近辺に張り付き、システムがフリーズしたり、行数の取得に数十分かかってしまいます。

    Linuxのwcコマンドでは2秒くらいで行数が取れるので、おそらく私のスクリプトに不備があるかと思います
    アドバイスを頂けませんでしょうか?

    下記のような2つのスクリプトを試しました。

    1.
    $targetfile="c:\tmp\log.csv"
    (type $targetfile).Length

    2.
    $targetfile="c:\tmp\log.csv"
    (Get-Content $targetfile).Length
    2016年2月9日 1:35

回答

  • @([System.IO.File]::ReadLines("c:\tmp\log.csv")).Length

    がそこそこ速いでしょうか。

    追記。@()では配列を作るので答えになっていませんでした。

    [System.Linq.Enumerable]::Count([System.IO.File]::ReadLines("c:\tmp\log.csv"))

    であればデータを保持せずに行数だけ数えることになるでしょうか。

    # まったくもって.NETでありPowerShellらしくはありませんが…shellでなくwcという外部コマンドに相当する行為を実行しようとするのであれば仕方がないかも。

    • 編集済み 佐祐理 2016年2月9日 2:53
    • 回答としてマーク Kenyamash 2016年2月9日 5:17
    2016年2月9日 1:48

すべての返信

  • @([System.IO.File]::ReadLines("c:\tmp\log.csv")).Length

    がそこそこ速いでしょうか。

    追記。@()では配列を作るので答えになっていませんでした。

    [System.Linq.Enumerable]::Count([System.IO.File]::ReadLines("c:\tmp\log.csv"))

    であればデータを保持せずに行数だけ数えることになるでしょうか。

    # まったくもって.NETでありPowerShellらしくはありませんが…shellでなくwcという外部コマンドに相当する行為を実行しようとするのであれば仕方がないかも。

    • 編集済み 佐祐理 2016年2月9日 2:53
    • 回答としてマーク Kenyamash 2016年2月9日 5:17
    2016年2月9日 1:48
  • ありがとうございます。これは速いですね。
    2016年2月9日 5:17