提取唯一和非唯一字符串以分隔输出文件

本文关键字:唯一 分隔 输出 文件 字符串 提取 | 更新日期: 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);