2015-05-29 160 views
0

我有三个文本文件:file1 file2和file3,它们都包含电子邮件。 file1应该有所有的电子邮件在那里,file2的所有电子邮件是AM,并且文件3有来自nz的电子邮件(这并不重要,但我认为这将有助于给出一点上下文。)比较文本文件的字符串

我正在写一个c#中的控制台应用程序,它将查看这三个文件,如果有一个不是1的电子邮件,它将写入一个主文件,该文件将说明需要添加什么内容。

例如,假设我有电子邮件[email protected]。如果它在file1中找到但不在file2中,则主文件的输出需要为"this email needs to be added to file2: [email protected]"。现在,如果它被颠倒了,并且电子邮件被发现在file2中但不在file1中,那么输出应该是"this email needs to be added to file1: [email protected]"

作为我的代码的一部分,我正在寻找的答案需要在某种foreach循环中进行,如果陈述,但是我有点失去了我需要的东西。如果有人可以请帮助我弄清楚我必须在我的陈述中使用什么,我将非常感激。如果有人对此有任何疑问,请随时询问!

//Making a list for file1 
List<string> listFullPack = new List<string>(); 
string line; 
StreamReader sr = new StreamReader("file1"); 
while ((line = sr.ReadLine()) != null) 
{ 
    listFile1.Add(line); 
} 
sr.Close(); 

//Making a list for file2 
List<string> listDen1 = new List<string>(); 
string line1; 

StreamReader sr1 = new StreamReader("file2"); 
while ((line1 = sr1.ReadLine()) != null) 
{ 
    listFile2.Add(line1); 
} 
sr1.Close(); 

//Making a list for file3 
List<string> listDen2 = new List<string>(); 
string line2; 

StreamReader sr2 = new StreamReader("file3"); 
while ((line2 = sr2.ReadLine()) != null) 
{ 
    listFile3.Add(line2); 
} 
sr2.Close(); 

//This will double check that emails are in 
foreach (string element in listFullPack) 
{ 
    System.Console.WriteLine(element); 
    Debug.WriteLine(element); 

    if (element == "[email protected]") 
    { 

     Debugger.Break(); 
    } 
} 

//this will compare the file1 list to the file2 list 
var firstNotSecond = listFile1.Except(listFile2).ToList(); 
var secondNotFirst = listFile2.Except(listFile1).ToList(); 

//this will compare the file2 list to the file3 list 
var firstNotThird = listFile1.Except(listFile3).ToList(); 
var thirdNotFirst = listFile3.Except(listFile1).ToList(); 

//this will compare the file2 list to the file3 list 
var secondNotThird = listFile2.Except(listFile3).ToList(); 
var thirdNotSecond = listFile3.Except(listFile2).ToList(); 

foreach (string element in listFile1) // This is where I am lost 
{ 
    if (!) 
    { 

    } 
} 
+0

在每个文件的电子邮件地址排序? – juharr

+0

请注意,示例电子邮件通常类似于“email @ example.com”或“example @ email.com”或“burn.burnitall @ aol.com”。 –

+0

@QPaysTaxes我知道,我只是想做一些不同的事情。它的星期五haha –

回答

1

你可以尝试一些简单的像这样:

//Making a list for file1 
    HashSet<string> listFile1 = new HashSet<string>(); 
    string line; 
    StreamReader sr = new StreamReader("file1"); 
    while ((line = sr.ReadLine()) != null) 
    { 
     listFile1.Add(line); 
    } 
    sr.Close(); 

    //Making a list for file2 
    HashSet<string> listFile2 = new HashSet<string>(); 
    string line1; 
    StreamReader sr1 = new StreamReader("file2"); 
    while ((line1 = sr1.ReadLine()) != null) 
    { 
     listFile2.Add(line1); 
    } 
    sr1.Close(); 

    //Making a list for file3 
    HashSet<string> listFile3 = new HashSet<string>(); 
    string line2; 
    StreamReader sr2 = new StreamReader("file3"); 
    while ((line2 = sr2.ReadLine()) != null) 
    { 
     listFile3.Add(line2); 
    } 
    sr2.Close(); 

    IEnumerable<string> allEmails = listFile1.Union(listFile2).Union(listFile3); 

    // this will double check the emails 
    foreach (string element in allEmails) 
    { 
     if (!listFile1.Contains(element)) 
      System.Console.WriteLine("file 1 is missing " + element); 

     int firstCharAscii = element.Trim().ToLower()[0]; 
     if (firstCharAscii < 110) 
     { 
      // less than "n" 
      if (!listFile2.Contains(element)) 
       System.Console.WriteLine("file 2 is missing " + element); 
      if (listFile3.Contains(element)) 
       System.Console.WriteLine("file 3 erroneously contains " + element); 
     } 
     else 
     { 
      // "n" or greater 
      if (!listFile3.Contains(element)) 
       System.Console.WriteLine("file 3 is missing " + element); 
      if (listFile2.Contains(element)) 
       System.Console.WriteLine("file 2 erroneously contains " + element); 
     } 
    } 

请记住,作为电子邮件的数量变大时,List<string>.Contains()方法成为判断是否存在一个低效的方式。你会更适合HashSet<string>班。另外,如果出于任何原因你在Unicode字符串中阅读,你需要一个更强大的方法来检查第一个字符的值。

+0

你接近我所要求的,但还没有完全。当我运行这个时,它会给我所有的电子邮件,然后给我一些我实际上不需要的东西。我需要的仅仅是缺失的电子邮件列表 –

+0

我编辑了代码以删除对“listFullPack”的引用并将其替换为“listFile1”。我也改变了一些其他列表名称,因为它似乎有太多的列表对象。看看它现在是否有效。 –

+0

它更好,但仍然是一件事情错了。我得到file1的整个输出。我只需要丢失的文件。当我运行它。我得到一个“控制台已停止工作”的消息,但它不会告诉我与控制台的问题 –

0
List<string> fullList = File.ReadAllLines("fullist.txt").ToList<string>(); 
List<string> firstList = File.ReadAllLines("list1.txt").ToList<string>(); 
List<string> secondList = File.ReadAllLines("list2.txt").ToList<string>(); 

firstList.ForEach(m => {if (!fullList.Contains(m)/*Or other logic*/) {fullList.Add(m+" from 1 Needs to be in master");}}); 
secondList.ForEach(m => {if (!fullList.Contains(m)/*Or other logic*/) {fullList.Add(m+ " from 2 Needs to be in master");}}); 
+0

不使用循环和很少的if语句。本练习的目的是使用循环 –

+0

如果我没有弄错'foreach'是一个循环,每个循环中都有一个'if'...//或其他逻辑* /中的另一位可以包含您的检查m [0]是否在您要查找的范围内。 ReadAllLines方法使代码更具可读性。另外,如果您正在使用流,请使用“使用”或“try ... finally”模式。 – BDH

0

这应该为你做。

 List<string> file1Parsed = new List<string>(); 
     List<string> file2Parsed = new List<string>(); 
     List<string> file3Parsed = new List<string>(); 

     using (StreamReader readerFile1 = new StreamReader(@"c:\file1.txt")) 
     { 
      while (!readerFile1.EndOfStream) 
      { 
       file1Parsed.Add(readerFile1.ReadLine()); 
      } 
     } 

     using (StreamReader readerFile2 = new StreamReader(@"c:\file2.txt")) 
     { 
      while (!readerFile2.EndOfStream) 
      { 
       file2Parsed.Add(readerFile2.ReadLine()); 
      } 
     } 

     using (StreamReader readerFile3 = new StreamReader(@"c:\file3.txt")) 
     { 
      while (!readerFile3.EndOfStream) 
      { 
       file3Parsed.Add(readerFile3.ReadLine()); 
      } 
     } 

     char[] firstSet = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M' }; 
     char[] secondSet = { 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; 

     var file1InFile2 = file1Parsed.Where(y => y.ToUpper().IndexOfAny(firstSet) == 0).Select(x => x); 
     var file1InFile3 = file1Parsed.Where(y => y.ToUpper().IndexOfAny(secondSet) == 0).Select(x => x); 

     using (StreamWriter writer = new StreamWriter(@"C:\notExists.txt")) 
     { 
      file1InFile2.Where(x => !file2Parsed.Contains(x.Trim())).ToList().ForEach(y => writer.WriteLine("This email needs to be added to file2: " + y)); 
      file1InFile3.Where(x => !file3Parsed.Contains(x.Trim())).ToList().ForEach(y => writer.WriteLine("This email needs to be added to file3: " + y)); 
      file2Parsed.Where(x => !file1InFile2.Contains(x.Trim())).ToList().ForEach(y => writer.WriteLine("This email needs to be added to file1: " + y)); 
      file3Parsed.Where(x => !file1InFile3.Contains(x.Trim())).ToList().ForEach(y => writer.WriteLine("This email needs to be added to file1: " + y)); 
     } 

我修改它的代码更少