忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

CSVファイルの DataGridView への読込について

以前の記事でCSVファイルを読込む処理を紹介しましたが、 今回はその関数を利用して DataGridViw コントロールへのデータ設定を行います。
CSVファイルの読込について      :[Microsoft.VisualBasic.FileIO.TextFieldParser]

DataGridViw への設定では ReadCsv:CSVファイル読込処理 から返された文字列配列を基に、各カラムに文字列として設定を行います。 DataGridViw は列が無いと対象セルへの設定ができないので、 ReadCsv 処理後最初に先頭行の列数を設定します。また、各行の設定の前で列数の変化があれば拡張を行っています。

CSVファイルの DataGridView への読込

Imports Microsoft.VisualBasic.FileIO

Public Class frmCSV2DGV

    ''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' CSVファイルの読込処理
    ''' </summary>
    ''' <param name="astrFileName">ファイル名</param>
    ''' <param name="ablnTab">区切りの指定(True:タブ区切り, False:カンマ区切り)</param>
    ''' <param name="ablnQuote">引用符フラグ(True:引用符で囲まれている, False:囲まれていない)</param>
    ''' <returns>読込結果の文字列の2次元配列</returns>
    ''' -----------------------------------------------------------------------------
    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

    ''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' CSVファイルのDataGridViewへの読込処理
    ''' (ReadCsv:CSVファイルの読込処理の利用による)
    ''' </summary>
    ''' <param name="dgv">DataGridView</param>
    ''' <param name="astrFileName">ファイル名</param>
    ''' <param name="ablnTab">区切りの指定(True:タブ区切り, False:カンマ区切り)</param>
    ''' <param name="ablnQuote">引用符フラグ(True:引用符で囲まれている, False:囲まれていない)</param>
    ''' -----------------------------------------------------------------------------
    Private Sub ReadCsvToDGV(ByVal dgv As DataGridView,
                             ByVal astrFileName As String,
                             Optional ByVal ablnTab As Boolean = False,
                             Optional ByVal ablnQuote As Boolean = False)
        Try
            'CSVファイル読込処理
            Dim arrCsv()() As String = ReadCsv(astrFileName, ablnTab, ablnQuote)

            'DataGridView クリア
            dgv.Rows.Clear()
            '列数の設定
            dgv.ColumnCount = arrCsv(0).Length

            Dim row As Integer = 0
            For Each arr In arrCsv
                'DataGridView 新規行を追加
                dgv.Rows.Add()

                'DataGridViewの列数がデータ配列数より小さい場合は列拡張
                If dgv.ColumnCount < arr.Length Then
                    dgv.ColumnCount = arr.Length
                End If

                For col As Integer = 0 To arr.Length - 1
                    'セルに列、行を指定して値の設定
                    dgv(col, row).Value = arr(col)
                Next

                '次の行へ
                row += 1
            Next

        Catch ex As Exception
            'エラー
            MsgBox(ex.Message)
        End Try
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'CSVファイルをDataGridViewへ読込処理
        ReadCsvToDGV(Me.DataGridView1, "test2.csv")
    End Sub
End Class


以下の様なCSVファイルを読込みます。

CSVファイルの内容

TEST1,TEST2,TEST3
1000,2000,3000
aaaa,bbbb,cccc,dddd
000,111,4444,55555,6666
AAAAAAA,BBBBB


読込んだフォームの表示は以下の様になります。


この場合 DataGridViw の列ヘッダに設定はしていませんので、CSVファイルの先頭行にヘッダが存在する場合を考慮した 読込関数を以下に記します。DataGridViw への設定関数と実行例の部分のみを抜粋しています。

CSVファイルの DataGridView への読込2

    ''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' CSVファイルのDataGridViewへの読込処理
    ''' (ReadCsv:CSVファイルの読込処理の利用による)
    ''' </summary>
    ''' <param name="dgv">DataGridView</param>
    ''' <param name="astrFileName">ファイル名</param>
    ''' <param name="ablnTab">区切りの指定(True:タブ区切り, False:カンマ区切り)</param>
    ''' <param name="ablnQuote">引用符フラグ(True:引用符で囲まれている, False:囲まれていない)</param>
    ''' <param name="ablnHeader">先頭行が列ヘッダ</param>
    ''' <param name="ablnExtendColumn">列数の拡張を行う指示</param>
    ''' -----------------------------------------------------------------------------
    Private Sub ReadCsvToDGV(ByVal dgv As DataGridView,
                             ByVal astrFileName As String,
                             Optional ByVal ablnTab As Boolean = False,
                             Optional ByVal ablnQuote As Boolean = False,
                             Optional ByVal ablnHeader As Boolean = False,
                             Optional ByVal ablnExtendColumn As Boolean = True)
        Try
            'CSVファイル読込処理
            Dim arrCsv()() As String = ReadCsv(astrFileName, ablnTab, ablnQuote)

            'DataGridView クリア
            dgv.Rows.Clear()

            Dim row As Integer = 0
            Dim blnFirst As Boolean = True
            For Each arr In arrCsv

                If blnFirst = True Then
                    blnFirst = False

                    If ablnHeader = True Then
                        '先頭行が列ヘッダの場合
                        dgv.Columns.Clear()
                        For Each strColName In arr
                            dgv.Columns.Add(strColName, strColName)
                        Next
                        Continue For

                    Else
                        '列数の設定
                        dgv.ColumnCount = arrCsv(0).Length
                    End If

                End If

                'DataGridView 新規行を追加
                dgv.Rows.Add()

                'DataGridViewの列数がデータ配列数より小さい場合は列拡張
                If ablnExtendColumn = True And dgv.ColumnCount < arr.Length Then
                    dgv.ColumnCount = arr.Length
                End If

                For col As Integer = 0 To arr.Length - 1

                    If col >= dgv.Columns.Count Then
                        Exit For
                    End If
                    'セルに列、行を指定して値の設定
                    dgv(col, row).Value = arr(col)
                Next

                '次の行へ
                row += 1

            Next

        Catch ex As Exception
            'エラー
            MsgBox(ex.Message)
        End Try
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'CSVファイルをDataGridViewへ読込処理:先頭行が列ヘッダで列数拡張
        ReadCsvToDGV(Me.DataGridView1, "test2.csv", False, False, True, True)
        MsgBox("OK")
        'CSVファイルをDataGridViewへ読込処理:先頭行が列ヘッダで列数拡張無し
        ReadCsvToDGV(Me.DataGridView1, "test2.csv", False, False, True, False)
    End Sub


実行結果(先頭行が列ヘッダで列数拡張)は以下の様になります。


メッセージ表示後(先頭行が列ヘッダで列数拡張無し)の表示は以下の様になります。

関連する記事

CSVファイルの読込について      :[Microsoft.VisualBasic.FileIO.TextFieldParser]
CSVファイルの書込について      :[System.IO.StreamWriter]
DataGridView からCSVファイルへの書込について











PR

コメント

コメントを書く