以前の記事で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
コメント