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