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
相关产品推荐
相关产品推荐

