我想要做的是根据拆分重新删除文本文件(反对自己)。完成重复数据删除后,请写入新文件并保留第一个结果。所以一个基本的例子是。我想问题是你如何根据字符串拆分在C#中删除文本文件。
文件1:
苹果| Turnip3234
苹果| Tunip22
福克斯| dsa34
龟| 3423
仓鼠| D34
福克斯| sdw2
结果:
苹果| Turnip3234
福克斯| dsa34
龟| 3423
仓鼠| d34
答案 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());