查询分隔文本文件中包含的数据以在VB.NET中填充数据网格的最简单方法

时间:2013-04-03 13:18:29

标签: sql vb.net linq text datatable

我正在尝试找到针对大型文本文件运行类似SQL的查询的最简单,最强大的方法,并填充数据网格。文本是分隔的,我正在尝试做的伪代码是:

table = parsed_text_file<br>
result = "SELECT CONCAT (first, last) AS name, COUNT(city) FROM table WHERE field = blah"<br>
DataGridView.DataSource = result

到目前为止,我尝试过使用:
1)<OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & textfile & ";Extended Properties='text;HDR=Yes;IMEX=1;FMT=TabDelimited';") 使用OleDbDataAdapter和SQL查询来填充数据集。这适用于SQL部分,但我在数据库连接和分隔符以及Schema.ini上遇到了很多问题

2)TextFieldParser构建数据集。这样可以很好地读取文件并创建表格,但只能使用DataView,Select和/或RowFilter进行查询。

3)逐行解析文件并填充数据集,但这非常慢。

在我使用数据集进入LINQ之前,肯定有一种更简单的方法可以完成这项工作吗?

4 个答案:

答案 0 :(得分:0)

您可以将文本文件读入SQLite数据库,然后使用实际SQL查询该数据库。

http://www.codeproject.com/Articles/22165/Using-SQLite-in-your-C-Application

答案 1 :(得分:0)

您提到输入是分隔的,但没有说明它是如何分隔的。我有一系列帖子和示例代码,说明在http://www.thinqlinq.com/Post.aspx/Title/LINQ-to-CSV-using-DynamicObject-and-TextFieldParser使用带有CSV输入文件的动态类型的LINQ。看看你的情况是否有帮助。

答案 2 :(得分:0)

这取决于你想要多么简单。您可以阅读csv并将其拆分。

foreach(string[] line in File.ReadLines(fileName).Split(","))
{
    // do stuff with line
}

但是它没有任何类型信息而且容易出错,但是如果你想要它快速而又脏,那就太棒了。

Microsoft Text Driver也可以使用OdbcConnection

public OdbcConnection GetConnection(string filePath)
{
    // MaxScanRows set to 0 will scan the entire file before generating types
    var connectionString =  @"Driver={Microsoft Text Driver (*.txt; *.csv)};" +
                            string.Format(@"Dbq={0};", filePath) +
                            @"Extensions=csv;MaxScanRows=0";

    var connection = new OdbcConnection(connectionString);
    return connection;
}

using(var connection = GetConnection(filePath))
{
    connection.Open();

    using(var command = new OdbcCommand("SELECT * FROM data.csv", connection))
    {
        using(var reader = command.ExecuteReader())
        {
            // Do stuff with reader
        }
    }
}

这种方法的缺点是它有点复杂,Microsoft Text Driver的文档很糟糕,它依赖于Jet,但它产生DataReader,这可以使数据的使用更容易。

答案 3 :(得分:0)

有一个名为SQL Plugin for Notepad ++的插件可以做到这一点。