将制表符分隔文件读入DataGridView

时间:2015-06-24 14:27:07

标签: vb.net datagridview tab-delimited header-row

以下代码我将一个制表符分隔文件读入DataGridView。它工作正常,但有几个问题我不确定如何解决。

@WebFilter

如何根据标题行中的字段数添加字段(列)?标题行目前包含110个字段,我不想以与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 类似的方式定义

我还需要跳过标题行,然后才显示行。

有没有更好的方法来处理这个我正在做的事情?

1 个答案:

答案 0 :(得分:2)

有几种工具可以解析这种类型的文件。一个是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数据转换为任何数据。

这需要使用Schema.INI来定义文件。这将替换连接字符串中的大多数扩展属性,只留下Extended Properties='TEXT';"(这意味着使用TEXT驱动程序)。在与数据相同的文件夹中创建文件名Schema.INI

  

[Capitals.txt]
  ColNameHeader =真
  字符集= 437
  格式= TabDelimited
  TextDelimiter =“
  DecimalSymbol =。
  CURRENCYSYMBOL = $
  Col1 =“国家”文字宽度254
  Col2 =“首都”文字宽度254
  Col3 =“人口”单一   Col4 =“假”整数

一个Schema.INI可以包含许多文件的布局。每个文件都有自己的标题为文件名称的部分(例如[FooBar.CSV][Capitals.txt]等)

大多数条目应该是不言自明的,但FORMAT定义了列分隔符(TabDelimitedCSVDelimited或自定义Delimited(;)); TextDelimiter是字符用于在列数据可能包含空格或其他特殊字符时将其括起来。像CurrencySymbol之类的东西允许您允许外来符号,可以省略。

您可以在ColN=列表中重命名列并指定数据类型。输入100多列可能会很繁琐,但它可能主要是复制和粘贴。完成后,您将始终拥有它,并能够轻松使用键入的数据。

您不需要指定列名/大小/类型来使用Schema.INI 如果文件包含列名作为第一行(ColNameHeader = True),则可以使用Schema只需以清晰易读的方式指定各种参数,而不是将它们压缩到连接字符串中。

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,数据类型:System.String
  name:Population,datatype:System.Single
  name:Fake,数据类型:System.Int32

另见: