将制表符分隔的文件读入 DataGridView
Read Tab Delimited File Into DataGridView
我的以下代码将制表符分隔的文件读取到 DataGridView 中。它工作正常,但有几个问题我不确定如何解决。
Dim query = From line In IO.File.ReadAllLines("C:\Temp\Temp.txt")
Let Data = line.Split(vbTab)
Let field1 = Data(0)
Let field2 = Data(1)
Let field3 = Data(2)
Let field4 = Data(3)
DataGridView1.DataSource = query.ToList
DataGridView1.Columns(0).Visible = False
如何根据 header 行中的字段数添加字段(列)? header 行当前包含 110 个字段,我不想以类似于 Let field1 = Data(0)
的方式定义这些字段
我还需要跳过 header 行,只显示此行之后的行。
有没有比我目前正在做的更好的方法来处理这个问题?
有多种工具可以解析此类文件。一种是 OleDB。
我不太明白(已删除的)答案是如何工作的,因为 HDR=No;
告诉文本 Driver 第一行不包含列名。但是在没有 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
数据转换为任何数据。
这需要使用 Schema.INI
来定义文件。这将替换连接字符串中的大部分扩展属性,只留下 Extended Properties='TEXT';"
(这意味着使用 TEXT Driver)。在与数据相同的文件夹中创建文件名Schema.INI
:
[Capitals.txt]
ColNameHeader=True
CharacterSet=437
Format=TabDelimited
TextDelimiter="
DecimalSymbol=.
CurrencySymbol=$
Col1="Country" Text Width 254
Col2="Capital City" Text Width 254
Col3="Population" Single
Col4="Fake" Integer
一个Schema.INI
可以包含多个文件的布局。每个文件都有自己的部分,标题为文件名(例如 [FooBar.CSV]
、[Capitals.txt]
等)
大部分条目应该是 self-explanatory,但 FORMAT
定义了列分隔符(TabDelimited
、CSVDelimited
或自定义 Delimited(;)
); TextDelimiter
是用于包含列数据的字符,当它可能包含空格或其他特殊字符时。 CurrencySymbol
之类的东西允许您使用外来符号并且可以省略。
ColN=
列表是您可以重命名列和指定数据类型的地方。输入 100 多列可能会很乏味,但它可能主要是复制和粘贴。一旦完成,您将始终拥有它并能够轻松使用键入的数据。
您无需指定列 names/size/type 即可使用 Schema.INI 如果文件包含列名作为第一行 (ColNameHeader=True ), 您可以简单地使用架构以清晰易读的方式指定各种参数,而不是将它们压缩到连接字符串中。
OleDB 在与导入文件相同的文件夹中查找 Schema.INI,然后查找包含 SQL 中使用的 "table" 的确切名称的部分:
' 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
输出:
name: Country, datatype: System.String
name: Capital City, datatype: System.String
name: Population, datatype: System.Single
name: Fake, datatype: System.Int32
另请参阅:
- Schema.INI 对于大多数合法设置
- Code Page Identifiers 用于
CharacterSet
的值
我的以下代码将制表符分隔的文件读取到 DataGridView 中。它工作正常,但有几个问题我不确定如何解决。
Dim query = From line In IO.File.ReadAllLines("C:\Temp\Temp.txt")
Let Data = line.Split(vbTab)
Let field1 = Data(0)
Let field2 = Data(1)
Let field3 = Data(2)
Let field4 = Data(3)
DataGridView1.DataSource = query.ToList
DataGridView1.Columns(0).Visible = False
如何根据 header 行中的字段数添加字段(列)? header 行当前包含 110 个字段,我不想以类似于 Let field1 = Data(0)
我还需要跳过 header 行,只显示此行之后的行。
有没有比我目前正在做的更好的方法来处理这个问题?
有多种工具可以解析此类文件。一种是 OleDB。
我不太明白(已删除的)答案是如何工作的,因为 HDR=No;
告诉文本 Driver 第一行不包含列名。但是在没有 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
数据转换为任何数据。
这需要使用 Schema.INI
来定义文件。这将替换连接字符串中的大部分扩展属性,只留下 Extended Properties='TEXT';"
(这意味着使用 TEXT Driver)。在与数据相同的文件夹中创建文件名Schema.INI
:
[Capitals.txt]
ColNameHeader=True
CharacterSet=437
Format=TabDelimited
TextDelimiter="
DecimalSymbol=.
CurrencySymbol=$
Col1="Country" Text Width 254
Col2="Capital City" Text Width 254
Col3="Population" Single
Col4="Fake" Integer
一个Schema.INI
可以包含多个文件的布局。每个文件都有自己的部分,标题为文件名(例如 [FooBar.CSV]
、[Capitals.txt]
等)
大部分条目应该是 self-explanatory,但 FORMAT
定义了列分隔符(TabDelimited
、CSVDelimited
或自定义 Delimited(;)
); TextDelimiter
是用于包含列数据的字符,当它可能包含空格或其他特殊字符时。 CurrencySymbol
之类的东西允许您使用外来符号并且可以省略。
ColN=
列表是您可以重命名列和指定数据类型的地方。输入 100 多列可能会很乏味,但它可能主要是复制和粘贴。一旦完成,您将始终拥有它并能够轻松使用键入的数据。
您无需指定列 names/size/type 即可使用 Schema.INI 如果文件包含列名作为第一行 (ColNameHeader=True ), 您可以简单地使用架构以清晰易读的方式指定各种参数,而不是将它们压缩到连接字符串中。
OleDB 在与导入文件相同的文件夹中查找 Schema.INI,然后查找包含 SQL 中使用的 "table" 的确切名称的部分:
' 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
输出:
name: Country, datatype: System.String
name: Capital City, datatype: System.String
name: Population, datatype: System.Single
name: Fake, datatype: System.Int32
另请参阅:
- Schema.INI 对于大多数合法设置
- Code Page Identifiers 用于
CharacterSet
的值