基于拆分的C#文本文件重复数据删除

时间:2011-01-18 14:55:35

标签: c#

我想要做的是根据拆分重新删除文本文件(反对自己)。完成重复数据删除后,请写入新文件并保留第一个结果。所以一个基本的例子是。我想问题是你如何根据字符串拆分在C#中删除文本文件。

文件1:
苹果| Turnip3234
苹果| Tunip22
福克斯| dsa34
龟| 3423
仓鼠| D34
福克斯| sdw2

结果:
苹果| Turnip3234
福克斯| dsa34
龟| 3423
仓鼠| d34

5 个答案:

答案 0 :(得分:3)

string inputFile; // = ...
string outputFile; // = ...
HashSet<string> keys = new HashSet<string>();

using (StreamReader reader = new StreamReader(inputFile))
using (StreamWriter writer = new StreamWriter(outputFile))
{
    string line = reader.ReadLine();
    while (line != null)
    {
        string candidate = line.Split('|')[0];
        if (keys.Add(candidate))
            writer.WriteLine(line);

        line = reader.ReadLine();
    } 
}

答案 1 :(得分:1)

使用HashSet<string>。存储左侧部分(|之前的所有内容)。

在每一行调用hashset.Contains(leftpart)以测试该行是否为“欺骗”。

答案 2 :(得分:0)

您可以创建Dictionary<string,string>,其中key是您的第一个单词,value是第二个单词。然后你可以浏览所有的行,拆分它们并检查Keys中是否出现第一个单词,如果没有则添加这个单词。

答案 3 :(得分:0)

这将始终使用遇到的第一个值(并且未经测试,但概念是正确的。)

Dictionary<String, String> dupeMap = new Dictionary<String, String>();
foreach (string line in File.Readlines("foo.txt")) {
    key = line.Split("|")[0];
    if (!dupeMap.ContainsKey(key)) {
        dupeMap.Add(key, line);
    }
}

然后你可以通过遍历Dictionary来回写它们,虽然这是稳定,因为你不能确定按顺序恢复这些行。

using (TextWriter tw = new StreamWriter("foo.txt")) {
    foreach (string key in dupeMap.Keys()) {
        tw.WriteLine(dupeMap[key]);
    }
}

答案 4 :(得分:0)

一个简单的解决方案是只添加您尚未遇到的值。

var allLines = File.ReadAllLines(@"c:\test.txt");

    Dictionary<string, string> allUniques = new Dictionary<string, string>();

    foreach(string s in allLines)
    {
        var chunks = s.Split('|');
        if (!allUniques.ContainsKey(chunks[0]))
        {
            allUniques.Add(chunks[0], s);
        }       
    }

    File.WriteAllLines(@"c:\test2.txt", allUniques.Values.ToArray());