隨筆 03 讀取.CSV文件轉爲datatable文件

69 阅读2分钟

具体来说,空字段在 DataTable 中将被设置为 String.Empty,这意味着对应的 DataTable 字段将会显示为空字符串,而不是 DBNull.Value

以下是已经处理空字段的 VB.NET 代码:

vb
复制代码
Imports System.Data
Imports Microsoft.VisualBasic.FileIO
Imports System.Text

Public Shared Function ReadCsv(hasHeader As Boolean, filePath As String, delimiter As Delimiters) As DataTable
    Try
        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)
        Dim dt As New DataTable()

        ' 使用 TextFieldParser 读取 CSV 文件
        Using parser As New TextFieldParser(filePath, Encoding.GetEncoding("shift_jis"))
            ' 设置字段类型为分隔符
            parser.TextFieldType = FieldType.Delimited

            ' 设置分隔符
            If delimiter = Delimiters.tab Then
                parser.SetDelimiters(vbTab)
            Else
                parser.SetDelimiters(",")
            End If

            ' 设置是否使用引号
            parser.HasFieldsEnclosedInQuotes = True

            Dim data() As String
            ' 读取第一行以确定列数
            If Not parser.EndOfData Then
                data = parser.ReadFields()
                Dim cols As Integer = data.Length
                If hasHeader Then
                    ' 使用 CSV 文件中的第一行作为列名
                    For i As Integer = 0 To cols - 1
                        dt.Columns.Add(New DataColumn(data(i)))
                    Next
                Else
                    ' 如果没有标题行,则添加列
                    For i As Integer = 0 To cols - 1
                        dt.Columns.Add(New DataColumn())
                    Next

                    ' 添加第一行数据
                    Dim row As DataRow = dt.NewRow()
                    For i As Integer = 0 To cols - 1
                        row(i) = If(i < data.Length AndAlso Not String.IsNullOrEmpty(data(i)), data(i), String.Empty) ' 处理空字段
                    Next
                    dt.Rows.Add(row)
                End If
            End If

            ' 读取剩余的数据
            While Not parser.EndOfData
                data = parser.ReadFields()
                Dim row As DataRow = dt.NewRow()
                For i As Integer = 0 To dt.Columns.Count - 1
                    row(i) = If(i < data.Length AndAlso Not String.IsNullOrEmpty(data(i)), data(i), String.Empty) ' 处理空字段
                Next
                dt.Rows.Add(row)
            End While

            ' 关闭文件
            parser.Close()
        End Using

        Return dt
    Catch ex As Exception
        ' 捕获异常并显示详细信息
        Dim errorMessage As String = $"An error occurred while reading the CSV file: {ex.Message}"
        Throw New ApplicationException(errorMessage, ex)
    End Try
End Function

关键点:

  • 处理空字段:在代码中,If(i < data.Length AndAlso Not String.IsNullOrEmpty(data(i)), data(i), String.Empty) 用于检查数据是否存在并且不为空。如果数据为空或列数不足,将对应字段设置为 String.Empty
  • 空值处理:如果 CSV 文件中存在连续的分隔符(如 ,,,,),对应的字段在 DataTable 中会被设置为空字符串 String.Empty

这种处理方式确保在导入 CSV 文件时,空字段会被正确地表示为 String.Empty,而不会导致数据丢失或格式问题。

4o mini