1

我试图找到对大型文本文件运行类似 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 部分,但我在 db 连接和分隔符以及 Schema.ini 方面遇到了很多问题

2) TextFieldParser 构建数据集。这可以很好地读取文件并创建一个表,但是只使用 DataView、Select 和/或 RowFilter 来查询是一条狗。

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

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

4

4 回答 4

0

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

于 2013-04-03T13:37:32.493 回答
0

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

于 2013-12-19T21:35:01.087 回答
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可以使使用数据更容易的方法。

于 2013-04-03T16:31:41.090 回答
0

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

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

于 2013-04-03T13:31:10.467 回答