我正在尝试找到针对大型文本文件运行类似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之前,肯定有一种更简单的方法可以完成这项工作吗?
答案 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 ++的插件可以做到这一点。