You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CSV数据行导入异常求助:导入至DataSet.Tables("CSVImportedFile")失败

如何将CSV文件导入至DataSet.Tables("CSVImportedFile")?

看起来你正在尝试用VB.NET把CSV文件导入DataSet的指定表中,你的代码已经有了开头,我来帮你补全并提供两种可靠的实现方案:

首先先把你给出的未完成代码整理一下:

Imports System.Data.OleDb
Imports System.IO

Dim ImportCSV As New OpenFileDialog With {
    .Title = "Import CSV File",
    .Filter = "PowerBI (*.csv)|*.csv"
}
If ImportCSV.ShowDialog = DialogResult.OK Then
    Dim CSVPath As String = ImportCSV.FileName
    Dim CSVDirectory As String = Path.GetDirectoryName(CSVPath) & "\"
    Dim CSVFile As String = Path.GetFileName(CSVPath)
    Using ImportConnection As System.Data.OleDb.OleDbConnection
        ' 这里代码未完成
    End Using
End If

接下来是两种完整的实现方式:

方法1:使用OleDbConnection(适合标准格式CSV)

这种方法利用OleDb驱动把CSV当成数据库表来读取,适合结构规范的CSV文件:

Imports System.Data.OleDb
Imports System.IO

' 放在你的方法内部
Dim ImportCSV As New OpenFileDialog With {
    .Title = "Import CSV File",
    .Filter = "CSV Files (*.csv)|*.csv"
}

If ImportCSV.ShowDialog = DialogResult.OK Then
    Dim CSVPath As String = ImportCSV.FileName
    Dim CSVDirectory As String = Path.GetDirectoryName(CSVPath)
    Dim CSVFile As String = Path.GetFileName(CSVPath)
    
    ' 构建连接字符串:HDR=YES表示第一行是列名,FMT=Delimited(,)指定分隔符为逗号
    Dim connectionString As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={CSVDirectory};Extended Properties=""Text;HDR=YES;FMT=Delimited(,)"";"
    
    Using ImportConnection As New OleDbConnection(connectionString)
        ImportConnection.Open()
        ' 查询CSV文件的所有内容
        Dim query As String = $"SELECT * FROM [{CSVFile}]"
        Using adapter As New OleDbDataAdapter(query, ImportConnection)
            Dim ds As New DataSet()
            ' 将数据填充到名为"CSVImportedFile"的表中
            adapter.Fill(ds, "CSVImportedFile")
            
            ' 这里可以对导入后的表进行操作
            MessageBox.Show($"成功导入 {ds.Tables("CSVImportedFile").Rows.Count} 条数据")
        End Using
    End Using
End If

注意事项:

  • 需要确保你的系统安装了Microsoft Access Database Engine(如果是64位项目,要安装对应版本的引擎)
  • 如果CSV使用的是其他分隔符(比如分号),把FMT=Delimited(,)改成FMT=Delimited(;)
  • 如果CSV没有表头,把HDR=YES改成HDR=NO,此时表的列名会自动变为F1、F2、F3...

方法2:使用TextFieldParser(灵活处理非标准CSV)

如果你的CSV里有包含分隔符的字段(比如带引号的"Smith, Alice"),OleDb可能解析出错,这时候用.NET自带的TextFieldParser更靠谱:

Imports Microsoft.VisualBasic.FileIO
Imports System.Data

' 放在你的方法内部
Dim ImportCSV As New OpenFileDialog With {
    .Title = "Import CSV File",
    .Filter = "CSV Files (*.csv)|*.csv"
}

If ImportCSV.ShowDialog = DialogResult.OK Then
    Dim CSVPath As String = ImportCSV.FileName
    Dim ds As New DataSet()
    ' 创建目标表
    Dim csvTable As DataTable = ds.Tables.Add("CSVImportedFile")
    
    Using parser As New TextFieldParser(CSVPath)
        parser.TextFieldType = FieldType.Delimited
        parser.SetDelimiters(",")
        parser.HasFieldsEnclosedInQuotes = True ' 关键:处理带引号的字段
        
        ' 读取第一行作为列名
        Dim columnNames As String() = parser.ReadFields()
        For Each colName As String In columnNames
            csvTable.Columns.Add(New DataColumn(colName))
        Next
        
        ' 逐行读取数据并添加到表中
        While Not parser.EndOfData
            Try
                Dim fields As String() = parser.ReadFields()
                csvTable.Rows.Add(fields)
            Catch ex As MalformedLineException
                ' 捕获格式错误的行,避免程序崩溃
                MessageBox.Show($"跳过格式错误的行:{ex.Message}")
            End Try
        End While
    End Using
    
    ' 操作导入后的表
    MessageBox.Show($"成功导入 {csvTable.Rows.Count} 条数据")
End If

注意事项:

  • 这种方法不需要额外安装任何组件,是.NET Framework/ .NET Core自带的
  • HasFieldsEnclosedInQuotes = True一定要开启,否则包含分隔符的字段会被错误拆分
  • 可以通过Try-Catch块处理格式不规范的行,提升程序的容错性

内容的提问来源于stack exchange,提问作者lolikols

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:21:26