VB.NET Tips - CSVファイル読込処理

CSVファイルを全て読み込み、文字列の2次元配列に戻す関数を説明します。 CSVファイルを読み込むには、Microsoft.VisualBasic.FileIO.TextFieldParserクラスを使用すると割と簡単に処理すことができます。

CSVファイル名を指定し、TextFieldParserクラスのインスタンスを作成し、 さらに区切りの指定及びフィールドが引用符で囲まれているかの指定を行います。

実際のファイルの読込は、1行ずつをReadFields()関数で行います。結果は文字列配列に返りますのでそれを適切に処理してやります。 読込のループの先頭でEndOfDataプロパティをチェックし、これがTrueであれば読込が最後まで来ています。 ループを抜けてファイルを閉じてやればOKです。

関数の戻り値として、文字列の2次元配列にしていますので呼び出し側の処理の例を載せておきます。

CSVファイル読込処理

    ''' -----------------------------------------------------------------------------
    ''' 
    ''' CSVファイルの読込処理
    ''' 
    ''' ファイル名
    ''' 区切りの指定(True:タブ区切り, False:カンマ区切り)
    ''' 引用符フラグ(True:引用符で囲まれている, False:囲まれていない)
    ''' 読込結果の文字列の2次元配列
    ''' -----------------------------------------------------------------------------
    Private Function ReadCsv(ByVal astrFileName As String,
                             ByVal ablnTab As Boolean,
                             ByVal ablnQuote As Boolean) As String()()
        ReadCsv = Nothing
        'ファイルStreamReader
        Dim parser As Microsoft.VisualBasic.FileIO.TextFieldParser = Nothing
        Try
            'Shift-JISエンコードで変換できない場合は「?」文字の設定
            Dim encFallBack As System.Text.DecoderReplacementFallback = New System.Text.DecoderReplacementFallback("?")
            Dim enc As System.Text.Encoding =
                System.Text.Encoding.GetEncoding("shift_jis", System.Text.EncoderFallback.ReplacementFallback, encFallBack)

            'TextFieldParserクラス
            parser = New Microsoft.VisualBasic.FileIO.TextFieldParser(astrFileName, enc)

            '区切りの指定
            parser.TextFieldType = FieldType.Delimited
            If ablnTab = False Then
                'カンマ区切り
                parser.SetDelimiters(",")
            Else
                'タブ区切り
                parser.SetDelimiters(vbTab)
            End If

            If ablnQuote = True Then
                'フィールドが引用符で囲まれているか
                parser.HasFieldsEnclosedInQuotes = True
            End If

            'フィールドの空白トリム設定
            parser.TrimWhiteSpace = False

            Dim strArr()() As String = Nothing
            Dim nLine As Integer = 0
            'ファイルの終端までループ
            While Not parser.EndOfData
                'フィールドを読込
                Dim strDataArr As String() = parser.ReadFields()

                '戻り値領域の拡張
                ReDim Preserve strArr(nLine)

                '退避
                strArr(nLine) = strDataArr
                nLine += 1
            End While

            '正常終了
            Return strArr

        Catch ex As Exception
            'エラー
            MsgBox(ex.Message)
        Finally
            '閉じる
            If parser IsNot Nothing Then
                parser.Close()
            End If
        End Try
    End Function

    '仮にテストプログラム
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            Dim arrCsv()() As String = ReadCsv("test.csv", False, False)

            Dim strData As String = ""
            For Each arr() As String In arrCsv
                For Each str As String In arr
                    strData &= str & ","
                Next
                strData &= vbCrLf
            Next
            MsgBox(strData)

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub