プログラム

2回ループしないで、CSVファイルの行数を取得する方法

このCSVファイルには、何件の行データが存在するの?

「CSVデータ取込み時にプログレスバーを使いたいのに、CSVファイルから簡単に行数を取得できない!」と思った事はないですか?

でも、System.IO.StreamReaderクラスには行数を取得するメソッドが用意されていないので、
ReadLineメソッドで行を1行ずつ読みながら最終行までの行数を数えて…
その後に、またファイルを1行目から最終行までループさせデータを取得する。
そんな、CSVファイル読込で2度手間をかけている人いませんか?

恥ずかしながら、私はそうでした。

でも、同じファイルを二度読むわけだから、これはどう考えても無駄な処理。なんとかやめたい…
そんな試行錯誤した結果、無駄な処理を無くすことのできるプログラムを作れたので公開したいと思います。

サンプル【VB.net】

Imports System.IO.StreamReader

	''読込み
	Private Sub 読込み()
		Dim getCSVデータ As New StreamReader([CSVファイルパス], System.Text.Encoding.Default)	''インスタンスを生成する
		Dim getCSV行() As String
		Dim getCSV項目() As String

		''CSVの全データ取得し、改行で区切
		getCSV行 = Split(getCSVデータ.ReadToEnd, vbCrLf) 

		''行数を取得
		Dim get件数 as Integer = getCSV行.Count - 1

		' 読み込みできる文字がなくなるまで繰り返す
		For rowCount As Integer = 0 To get件数
			''ファイルを 1 行ずつ読み込む
			Dim get行 As String = getCSV行(rowCount)

			''空白行は飛ばす
			If get行 = "" Then Exit For

			''項目取得(区切り文字によって修正する)
			getCSV項目= Split(get行, """,""")

			''取得したデータをどうするか処理はこの辺にいれる

		Next

		''閉じる
		getCSVデータ.Close()

	End Sub 

解説

この方法は、CSVデータを一度に取得(ReadToEndメソッド)して、そのデータを改行コードで区切って配列に入れるというやり方です。
配列に入れてしまえば後は簡単、件数を取ることもできるし、好きな行を取り出す事もできます。

デメリットとしては、CSVデータ全件をメモリに確保するやり方なので、大きいデータの場合は1行ずつ読込んだ方がいいということです。

参考URL

全ては時の中に…|【VB.NET】ファイルの内容を全て読込む

修正

2018/02/02 コメントで指摘があったとおり、PGに問題がありましたので修正しました。

 あなたの新しい一歩のお手伝いをします
岩間 崇

コメント

  1. aya より:

    If の終わりが見えない…
    for なのに Next じゃないのか…

    1. 岩間 崇 より:

      ayaさん、ご指摘ありがとうございます。
      PGに修正を行いました。
      if の終わり「End if」は一行で書いているので、いらないようになっています。

コメントを残す

*