具体来说,空字段在 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