2016-05-13 40 views
0

我想根据特定输出将数据添加到文本文件中,它将读取XML文件并将特定行写入文本文件。如果数据已经写入文本文件,我不想再写一遍。如何在文本文件中不包含数据(如果已经存在)

代码:

public void output(string folder) 
{ 
    string S = "Data" + DateTime.Now.ToString("yyyyMMddHHmm") + ".xml"; 
    //Trades.Save(S); 
    string path = Path.Combine(folder, S); 
    Console.WriteLine(path); 
    XDocument f = new XDocument(Trades); 

    f.Save(path); 

    string[] lines = File.ReadAllLines(path); 
    File.WriteAllLines(path, lines); 

    using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"H:\Test" + DateTime.Now.ToString("yyMMdd") + ".txt", true)) 
    { 
     foreach (string line in lines) 
     { 
      if (line.Contains("CertainData")) 
      { 
       file.WriteLine(line); 
       if (File.ReadAllLines(path).Any(x => x.Equals(line))) 
       { 
       } 
       else 
       { 
        string[] tradeRefLines = File.ReadAllLines(path); 
        File.WriteAllLines(path, tradeRefLines); ; 
       } 

      } 
     } 
    } 
} 

问题是,它仍然会写行,即使数据是完全一样的其他地方。我不想复制线

有什么建议吗?

澄清UPDATE

的“CertainData”是一个参考号码

我有一大堆的文件,这些文件中有数据和一块我想单独和放入文本文件“ CertainData”领域,这将有一个参考号码

有时候我发将里面的相同的格式化信息与文件‘在他们的CertainData’出现供参考

当我运行这个程序时,如果文本文件中已经包含“CertainData”参考编号,我不希望它被写入

如果您需要任何更多的澄清让我知道,我会更新帖子

+0

你的意思是你不想写重复的行到一个文件? – kkaosninja

+0

如果你必须检查它是否存在*在所有文档中*而不是在每行中,那么使用ReadAllText,它将只返回一个字符串,然后Contains会给你你期待的结果 – Gusman

+0

@kkaosninja是的,对不起,如果我没有足够清楚 – Nonagon

回答

2

为什么在for循环之前不使用Distinct。这会在写入文件之前过滤你的行。

尝试这样的事情

string[] lines = new string[] { "a", "b", "c", "a" }; 

string[] filterLines = lines.Distinct().ToArray<string>(); 
4

我想你想要这样的:读取所有行,过滤掉那些含有关键字,并将其写入到一个新文件。

var lines = File.ReadAllLines(path).ToList(); 
var filteredLines = lines.Where(!line.Contains("CertainData")); 
File.WriteAllLines(path, filteredLines); 

如果您也想删除重复的线路,你可以添加不同的是这样的:

filteredLines = filteredLines.Distinct(); 
+0

很好的答案!不幸的是,在“CertainData”区域中添加的数据将使用唯一标识符。 – Nonagon

+0

你是什么意思与唯一标识符?你能解释一下这个问题吗? – Carra

+0

更新为公证,谢谢 – Nonagon

相关问题