为快速访问C#windows窗体应用加载文本文件
另一方面我找不到答案,我会在这里问。我有一个大约100000行的文本文件。我已经对它做了多次类似这样的查询为快速访问C#windows窗体应用加载文本文件,c#,sql,text,C#,Sql,Text,另一方面我找不到答案,我会在这里问。我有一个大约100000行的文本文件。我已经对它做了多次类似这样的查询 string header = isFirstRowHeader ? "Yes" : "No"; string pathOnly = Path.GetDirectoryName(path); string fileName = Path.GetFileName(path); string sql = @"SELECT Count(*) as NumberofRecords FROM ["
string header = isFirstRowHeader ? "Yes" : "No";
string pathOnly = Path.GetDirectoryName(path);
string fileName = Path.GetFileName(path);
string sql = @"SELECT Count(*) as NumberofRecords FROM [" + fileName + "]";
using (OleDbConnection connection = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly +
";Extended Properties=\"Text;HDR=" + header + "\""))
using (OleDbCommand command = new OleDbCommand(sql, connection))
using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
{
DataTable dt = new DataTable();
dt.Locale = CultureInfo.CurrentCulture;
adapter.Fill(dt);
return dt;
}
它正在做这个的多个版本。有没有办法加载文本文件,这样我可以更快地运行这样的东西?有更好的办法吗?目前需要的时间太长了 使用流将文件加载到内存中,请参阅。一旦它进入内存,请运行查询等。您可以使用以下示例:
string filename = @"C:\BigTextFile.txt";
StreamReader sr = System.IO.File.OpenText(filename);
// Process line by line.
string line = "";
do
{
line = sr.ReadLine();
}
while(sr.Peek() != -1);
// Load all at once and process.
string alltext = sr.ReadToEnd();
sr.Close();
你想干什么 从您的示例来看,似乎您要做的唯一一件事就是获取文件中的记录数 如果*您没有跨多行的内容,您可以安全地只计算行数(-1行用于标题) *当且仅当 编辑: 因此,计算行数不是一个选项,因为你正在做更复杂的事情 我刚刚生成了一个包含100k条记录(7.7MB大小)的示例文件,该文件在0.43秒内得到处理。正在进行<代码>计数(*)。。按名称分组花了0.58秒
你的数字是多少?为什么你认为这花费的时间太长?档案在哪里?这可能是网络/硬盘速度慢的问题吗?对于小文件来说是个不错的选择,但我认为对于将如此大的文件(100000行)加载到内存中来说,这不是个好选择。好吧,每一行可能有24个字节*100000,所以您的顺序是兆字节。你可能有几GB的内存,所以你真的没有什么可担心的。你想说服OleDbConnection如何使用你的内存流?这样就不需要像访问文件那样的活动了directly@ldgorman:请告诉我如何在内存中的blob上“运行查询”。因此,您有一个长字符串,什么next@Jodrell:您只有最后一行,所有文本都应为空:)为什么投票被否决?代码显示了两种方法,即逐行读取或同时读取所有数据。您是否进行了足够的查询来证明优化此方法的合理性?如果是这样的话,你可以把整个东西都放到一个
数据表或内存中的数据库中,然后对它运行一次查询。那么,你能发布一个更复杂的样本以及它所需要的时间吗?还有一些更复杂的事情,比如计算名字和姓氏的组合,我刚刚发布了最简单的一个。