查找文本文件中所有相似的行
本文关键字:相似 文本 文件 查找 | 更新日期: 2023-09-27 18:18:06
我有一个文本文件,其中包含一些逗号分隔的值。它看起来像这样:
3,23500,R,5998,20.38,06/12/2013 01:44:17
2,23500,P,5983,20.234,06/12/2013 01:44:17
3,23501,R,5998,20.38,06/12/2013 01:44:18
2,23501,P,5983,20.235,06/12/2013 01:44:18
3,23502,R,6000,20.4,06/12/2013 01:44:19
2,23502,P,5983,20.236,06/12/2013 01:44:19
3,23503,R,5999,20.39,06/12/2013 01:44:20
2,23503,P,5983,20.236,06/12/2013 01:44:20
我的任务是提取唯一文件中以相同数字开头的行。例如,在上面的例子中,你看到一些行以2
开头,一些以3
开头…可以有更多的案例,如4
等…
做到这一点的最好和最快的方法是什么?我正在处理的文件相当大,有时达到千兆字节…
我确实拆分了每行并存储第一个值,这将是我在数组中寻找的数字,然后从数组中删除重复的值…它工作,但它是非常缓慢的!
这是我自己的代码:
private void buttonBeginProcess_Click(object sender, EventArgs e)
{
var file = File.ReadAllLines(_fileName);
var nodeId = new List<int>();
foreach (var line in file)
{
nodeId.Add(int.Parse(line.Split(',')[0]));
}
//Unique numbers
nodeId = nodeId.Distinct().ToList();
}
var lines = File.ReadLines(myFilePath);
var lineGroups = lines
.Where(line => line.Contains(","))
.Select(line => new{key = line.Split(',')[0], line})
.GroupBy(x => x.key);
foreach(var lineGroup in lineGroups)
{
var key = lineGroup.Key;
var keySpecificLines = lineGroup.Select(x => x.line);
//save keySpecificLines to file
}
您可以尝试使用StreamReader
/StreamWriter
一次一行地处理每个文件:
var writers = new Dictionary<string, StreamWriter>();
using (StreamReader sr = new StreamReader(pathToFile))
{
while (sr.Peek() >= 0)
{
var line = sr.ReadLine();
var key = line.Split(new[]{ ',' },2)[0];
if (!lineGroups.ContainsKey(key))
{
writers[key] = new StreamWriter(GetPathToOutput(key));
}
writers[key].WriteLine(line);
}
}
foreach(StreamWriter sw in writers.Values)
{
sw.Dispose();
}
使用此方法,您可以确保代码永远不必消耗整个输入文件,因此输入文件有多大并不重要。当然,缺点是它必须在整个过程中保持任意数量的文件打开。