2015-05-29 4 views
0

У меня есть три текстовых файла: file1 file2 и file3, все из которых содержат электронные письма. file1 должен иметь все электронные письма там, файл2 имеет все электронные письма, которые являются AM, а файл 3 имеет электронные письма от nz (это не важно, но я полагаю, что это помогло бы дать небольшой контекст.)Сравнение строк текстовых файлов

Я пишу консольную прикладную программу в C#, которая будет смотреть на эти три файла, и если есть электронное письмо, которое не является 1, где оно должно быть, то оно будет писать в мастер-файл, который скажет, что нужно добавить к чему.

Например, скажем, у меня есть адрес электронной почты [email protected]. Если он найден в файле1, но не в файле2, вывод главного файла должен быть "this email needs to be added to file2: [email protected]". Теперь, если это было отменено, и письмо было найдено в файле2, но не в файле1, тогда выход должен быть "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 Я знаю, я просто хотел сделать что-то другое. Его friday 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

Его лучше, но все же пара вещей не так. Я получаю весь вывод файла1. Мне нужны только недостающие файлы. Также когда я запускаю его. Я получаю сообщение «Консоль перестала работать», но он не скажет мне проблему с консолью –

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 делает код более читаемым. Кроме того, если вы используете потоки, используйте шаблон «using» или «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)); 
     } 

Я изменил его меньше кода

Смежные вопросы