加载文本文件以快速访问 C# 窗口窗体应用

本文关键字:窗口 窗体 应用 访问 文本 文件 加载 | 更新日期: 2023-09-27 18:31:43

我在另一个堆栈溢出上找不到这个问题的答案,我会在这里问它。 我有一个大约 100000 行的文本文件。 我一直在对它进行多次查询,例如

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;
}

它正在做这个的多个版本。 有没有办法加载文本文件,以便我可以更快地运行这样的事情? 有没有更好的方法? 目前花费的时间太长。

加载文本文件以快速访问 C# 窗口窗体应用

你想做什么?

从您的示例中,您尝试的唯一事情似乎是获取文件中的记录数。

您可能

可以安全地只计算行数(标题为 -1 行),如果您没有跨多行的内容。

*且仅当

编辑:

因此,计算行数不是一种选择,因为您正在做更复杂的事情。

我刚刚生成了一个包含 100k 条记录(大小为 7.7 MB)的示例文件,该文件在 0.43 秒内得到处理。做一个count(*) .. group by Name需要0.58秒。

你的数字是多少,为什么你认为它花了太长时间?文件在哪里?可能是网络/慢速驱动问题吗?

使用流将文件加载到内存中,请参阅此处。一旦它进入内存,运行你的查询等。

您可以使用以下示例:

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();