vb.net - OLEDB 将 CSV 导入 VB.NET 数据表,将 '-' 读取为 0

标签 vb.net visual-studio-2010 csv oledb

问候乐于助人、令人愉快的人们,

我在 VB.Net 中读取 CSV 文件并转换为数据表时遇到问题。 如果 CSV 文件包含一列充满“-”的列,则在导入数据表时它们将显示为“0”,并且整个列的格式为数字格式。

我写的代码是:

Public Function LoadCsvFile(filePath As String) As DataTable
    Try

        DTReadCSV = New DataTable

        Dim connection As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Microsoft.VisualBasic.Left(filePath, InStrRev(filePath, "\")) & ";Extended Properties=""text;HDR=Yes;FMT=Delimited""")

        Dim adapter As New OleDb.OleDbDataAdapter("SELECT * FROM [" + Microsoft.VisualBasic.Mid(filePath, InStrRev(filePath, "\") + 1) + "]", connection)
        'Dim table As New DataTable()
        adapter.Fill(DTReadCSV)

        'now thats its nicely in a datatable 
        IntAmountRows = DTReadCSV.Rows.Count
        IntAmountColumns = DTReadCSV.Columns.Count


        'System.Diagnostics.Debug.Print(DTReadCSV.Rows.Item(1)(1).ToString)
        Return DTReadCSV

        Exit Function
    Catch ex As Exception
        MsgBox(ex.ToString())

        MsgBox(Err.Number & " " & Chr(13) & Err.Description)
    End Try
End Function

除了通过删除“-”作为空白来修改 CSV 文件之外,请更聪明的人找出如何解决此问题,目前这似乎是导入这些 CSV 文件的唯一冗长方法。

非常感谢

最佳答案

使用 Schema.INI,您可以向 OleDB 详细描述 CSV 的样子,包括结果列名称和数据类型。例如,给定以下数据:

"Country","Capital City","Population", "Fake"
"France","Paris","2.25","-----"
"Canada","Toronto","2.5","-----"
"Italy","Rome","2.8","-----"

在同一文件夹中创建Schema.ini文件;它可以有多个部分来定义该文件夹中的各种 CSV。如果在与 CSV 相同的文件夹中存在 Schema.INI,并且它具有 CSV 的条目,OleDB 将自动使用它(无需执行任何特殊操作)。

上述数据的 Schema.INI 条目可能如下所示:

[Capitals.CSV]
ColNameHeader=True
CharacterSet=1252
Format=CSVDelimited
TextDelimiter="
Col1="Country" Text Width 254
Col2="Capital City" Text Width 254
Col3="Population" Single
Col4="Fake" Text Width 254

OleDb 在读取该文件时将使用这些定义,从而在输出中为“Fake”列生成一串破折号:

enter image description here

使用 Schema.INI 的一个额外好处(众多好处之一)是您可以命名其中的列,而不是使用或别名 F1、F2、F3 等。该输出的 SQL 只是 "SELECT * FROM大写字母.CSV"

提示(供其他人引用):要指定 UTF8 作为字符集,请在架构中使用 CharacterSet=65001

更多信息请参见
-Schema.ini Text File Driver
-Code Page Identifiers

关于vb.net - OLEDB 将 CSV 导入 VB.NET 数据表,将 '-' 读取为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28855994/

相关文章:

visual-studio-2008 - ReflectedDefinition 属性的问题

python - 值错误: x and y must be the same size

sql - 如何在 VB.NET 中编写可读的 SQL

vb.net - 有 VB 6 到 VB.net 转换指南吗?

c++ - 导致访问冲突的 realloc 实现问题

c# - 我想让表单上的所有文本框仅接受代码尽可能少的数字 - c#

database - UTF-8 元组存储使用最低公分母,仅追加

linux - 将文本 (.csv) 文件中的数字从一种语言环境格式转换为另一种语言环境格式?

vb.net - 默认表单实例何时创建?

vb.net - 如何将附加参数传递给谓词?