2013-09-09 4 views
0

Я пытаюсь найти способ сравнить текст в 2 файлах, и если совпадение найдено, запустите процесс.C# сравнить содержимое 2 файлов для совпадений

Примеры файлов;

'Файл A' = Автоматический список текстов с этим форматом;

example1 
ex2 
289 Example 
fht_nkka 

'Файл B' = Имена файлов из поиска каталогов;

example1 
test2 
test4785 

Используя мои файлы из 2-х примеров, я хочу найти их обоих и найти совпадения.

Так что «Файл A» содержит «пример1» и «пример1» находится в «файле B». То, что я хочу, чтобы сделать, это создать соответствие 'string [], основанное на всех совпадениях. Есть ли простой способ сделать это?

. Примечание: эти файлы не всегда имеют одни и те же данные строки или количество строк в

+0

UPDATE - Я могу также изменить расположение «File A», если это необходимо, но позиции будут такими же, так или иначе –

+1

вы пробовали что-нибудь? любой образец кода? –

+0

Я начинаю с C#, поэтому ничего не пробовал, поскольку я застрял в том, как это сделать. У меня есть другие поисковые запросы, которые выполняются в другом месте, но они ищут статические критерии поиска, этот динамический процесс «поиска и запуска» меня насторожил: S –

ответ

1

Удалось решить эту проблему, вот что я сделал;

var fileAcontents = File.ReadAllLines(fileA); 
var fileBcontents = File.ReadAllLines(fileB); 

HashSet<string> hashSet = new HashSet<string>(fileAcontents); 
foreach (string i in fileBList) 
{ 
    if (hashSet.Contains(i)) 
    { 
     // <- DO SOMETHING :) 
    } 
} 
-1

Наполните объект словаря с содержимым файла А затем цикл по содержанию B File запрашивая Файл словаря объекта. Причиной для словарного объекта является его скорость, если у вас большой массив данных.

Dictionary<int, string> FileA = new Dictionary<int, string>(); 
string sFileAList = dataFileA; 

Петля через файл Содержание и добавление в Dict, где я - счетчик.

int count = 0; 
foreach (string s in sFileAList.split('\n')) { 
    count++; 
    if (count > 3) FileA.Add(i, s); 
} 

Затем сравните, пройдя через содержимое файла B.

foreach (string s in dataFileB.split('\n')) { 
    if (FileA.ContainsValue(s)) { 
     // Run exe 
    } 
} 
+0

FileB - это какой тип объекта? –

+0

Исправлено. Должен быть FileA. Я старался, чтобы это было просто. – Papa

+0

-1 Словарь для скорости? Как ваш индекс помогает со скоростью? – Aron

1
  1. Использование System.IO.File.ReadAllLines() на каждой из двух файлов для создания двух строковых массивов.
  2. Создайте отсортированную версию массива, содержащую имена файлов, чтобы улучшить производительность поиска. Вы можете использовать LINQ для этой цели.
  3. Учитывая, что ваш первый файл имеет фиксированный макет, ваше обязательное имя файла всегда должно быть в строке № 4 для каждой записи, поэтому вы можете использовать цикл for во втором массиве с фиксированным приращением, чтобы прочитать требуемое имя файла.
  4. Используйте Array.BinarySearch(), чтобы быстро определить, существует ли требуемое имя файла в списке файлов (другой массив).

Вот грубый набросок коды:

string[] AllRecs = System.IO.File.ReadAllLines(FIRST_FILE_PATH); 
string[] AllFileNames = System.IO.File.ReadAllLines(SECOND_FILE_PATH); 
Array.Sort(AllFileNames); 

for (int i = 3; i < AllRecs.Length; i += 8) 
{ 
    if (Array.BinarySearch(AllFileNames, AllRecs(i) + ".exe") >= 0) 
     System.Diagnostics.Process.Start(AllRecs(i) + ".exe"); 

} 
+0

Учитывая, что он является инициатором с C#, этот подход довольно сложный. –

+0

Я, я согласен, но тогда он должен начать его откуда-то, так почему бы и нет сегодня. :) – dotNET

+2

Сортированный массив не самый эффективный. HashSet, плюс, проще. Тогда простая слагающая даст результат в приблизительно постоянном времени vs n квадрата времени. – Aron

0
//Keep in a list of strings with FileA contents 

List<string> linesOfFileA = new List<string>(); 
string line ; 

using (StreamReader sr = new StreamReader(pathToFileA)) 
{ 
    //read each line of fileA 
    line = sr.ReadLine(); 
    while(line != null) 
    { 
     linesOfFileA.Add(line) ; 
     line = sr.ReadLine(); 
    } 
} 
//Now read the contents of FileB 

string fileWithoutExtension ; 
int posOfExtension ; 

using (StreamReader srB = new StreamReader(pathToFileB)) 
{ 
    //read each line of fileB 
    line = sr.ReadLine(); 
    while(line != null) 
    { 
     posOfExtension = line.LastIndexOf("."); 

     if(posOfExtension < 0) 
     { 
      fileWithoutExtension = line ; 
     }    
     else 
     { 
      fileWithoutExtension = line.Substring(0,posOfExtension) ; 
     } 

     //Check to see if the FileA contains file but without Extension 
     if(linesOfFileA.Contains(fileWithoutExtension)) 
     { 
      //Store into another list/or execute here 
     } 
     line = sr.ReadLine(); 
    } 
} 

В первой части коды, пропускаемое количество строк, которые вам нужны, но из-за текущий показанный формат они не повлияет на ваше сравнение.

+0

ok, поэтому я удалил расширения из fileB, так что теперь файлы являются просто строками данных. Я создал первый список на основе fileA. Каким будет самый простой способ проверить «совпадения» и записать в строку [] match = 'matches'? –