提取唯一和非唯一字符串以分隔输出文件
本文关键字:唯一 分隔 输出 文件 字符串 提取 | 更新日期: 2023-09-27 18:35:11
我在尝试仅提取不重复的行和仅从测试文件中重复的行时遇到麻烦。输入文件同时包含重复行和非重复行。
我创建了一个日志记录函数,我可以从中提取所有唯一的行到一个单独的文件中,但其中包括重复的行和不是重复的行,我需要将它们分开。
这就是我目前所拥有的;
static void Dupes(string path1, string path2)
{
string log = log.txt;
var sr = new StreamReader(File.OpenRead(path1));
var sw = new StreamWriter(File.OpenWrite(path2));
var lines = new HashSet<int>();
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
int hc = line.GetHashCode();
if (lines.Contains(hc))
continue;
lines.Add(hc);
sw.WriteLine(line);
}
sw.Close();
}
理想情况下,这将在两个函数中,因此可以调用它们来对输出内容执行不同的操作。
使用 LINQ 对项目进行分组,然后检查计数:
var lines = File.ReadAllLines(path1);
var distincts = lines.GroupBy(l => l)
.Where(l => l.Count() == 1)
.Select(l => l.Key)
.ToList();
var dupes = lines.Except(distincts).ToList();
值得注意的是,Except
不会返回重复项 - 这是我刚刚学到的。 所以事后无需打电话Distinct
。
你可以
执行以下操作
var lines = File.ReadAllLines(path1);
var countLines = lines.Select(d => new
{
Line = d,
Count = lines.Count(f => f == d),
});
var UniqueLines = countLines.Where(d => d.Count == 1).Select(d => d.Line);
var NotUniqueLines = countLines.Where(d => d.Count > 1).Select(d => d.Line);