有几种工具可以解析这种类型的文件。一是OleDB。
我无法弄清楚(已删除)答案是如何工作的,因为HDR=No;
它告诉文本驱动程序第一行不包含列名。但是在没有 IMEX 的情况下读取前 8 行后,有时会忽略这一点。
但是,FMT=Delimited\"""
看起来它是从 C# 答案中复制的,因为 VB 不用于\
转义字符。看起来它也混淆了列分隔符(在这种情况下是逗号或制表符)和文本分隔符(通常是"
)
如果文件是制表符分隔的,则正确的值为FMT=TabDelimited
. 我猜这些字段是用引号(例如"France" "Paris" "2.25"
)分隔的文本,而 OleDB 是用引号而不是制表符来切分数据,以意外得到相同的结果。
正确的 ACE 字符串是:
Dim connstr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\Temp';Extended Properties='TEXT;HDR=Yes;FMT=TabDelimited';"
仅使用连接字符串会将每个文件导入为字符串。您还可以让 OleDB 将读取的数据转换为任何数据类型,这样您就不必在代码中乱扔大量数据以Convert.ToXXXX
将String
数据转换为任何数据类型。
这需要使用 aSchema.INI
来定义文件。这将替换连接字符串中的大部分扩展属性,只留下Extended Properties='TEXT';"
(这意味着使用 TEXT 驱动程序)。Schema.INI
在与数据相同的文件夹中创建文件名:
[Capitals.txt]
ColNameHeader=True
CharacterSet=437
Format=TabDelimited
TextDelimiter="
DecimalSymbol=.
CurrencySymbol=$
Col1="Country" 文本宽度 254
Col2="Capital City" 文本宽度 254
Col3="Population" Single
Col4="Fake “ 整数
一个Schema.INI
可以包含许多文件的布局。每个文件都有自己的部分,标题为文件名(例如[FooBar.CSV]
,[Capitals.txt]
等)
大多数条目应该是不言自明的,但FORMAT
定义了列分隔符(TabDelimited
或CSVDelimited
自定义Delimited(;)
);TextDelimiter
当可能包含空格或其他特殊字符时,该字符用于将列数据括起来。诸如CurrencySymbol
允许您允许使用外来符号之类的内容可以省略。
ColN=
您可以在列表中重命名列并指定数据类型。输入 100 多列可能很乏味,但可能主要是复制和粘贴。完成后,您将始终拥有它,并且能够轻松使用键入的数据。
您无需指定列名/大小/类型即可使用 Schema.INI 如果文件包含列名作为第一行 (ColNameHeader=True),您可以使用 Schema 简单地明确指定各种参数可读的方式,而不是将它们压缩到连接字符串中。
OleDB 在与导入文件相同的文件夹中查找 Schema.INI,然后查找带有 SQL 中使用的“表”的确切名称的部分:
' form level DT var
Private capDT As DataTable
' procedure code to load the file:
Dim connstr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\Temp';Extended Properties='TEXT';"
Dim SQL = "SELECT * FROM Capitals.txt"
capDT = New DataTable
' USING will close and dispose of resources
Using cn As New OleDbConnection(connstr),
cmd As New OleDbCommand(SQL, cn)
cn.Open()
Using da As New OleDbDataAdapter(cmd)
da.Fill(capDT)
End Using
End Using ' close and dispose
现在DataTable
可以使用了。如果我们迭代列,您可以看到它们与架构中指定的类型匹配:
' display data types
For n As Int32 = 0 To capDT.Columns.Count - 1
Console.WriteLine("name: {0}, datatype: {1}",
capDT.Columns(n).ColumnName,
capDT.Columns(n).DataType.ToString)
Next
输出:
名称:国家,数据类型:System.String
名称:首都,数据类型:System.String
名称:人口,数据类型:System.Single
名称:假,数据类型:System.Int32
也可以看看: