2016-06-26 4 views
0

Так я написал логику, чтобы создать объединение 2-х текстовых файлов в папке, а именно,Union несколько текстовых файлов

public static void UnionFiles() 
{ 
    var dinfo = 
     new DirectoryInfo(
      @"C:\http"); 
    var files = dinfo.GetFiles("*.txt"); 
    IEnumerable<string> _eValA = null; 
    IEnumerable<string> _eValB = null; 

    _eValA = File.ReadLines(@"C:\http1.txt"); 
    _eValB = File.ReadLines(@"C:\http2.txt"); 

    IEnumerable<String> union = _eValA.Union(_eValB); 

    File.WriteAllLines(@"C:\union.txt", union.Cast<string>()); 
} 

Теперь я застрял здесь, как создать объединение нескольких файлов ?

Моя проблема заключается в следующем: у меня есть несколько файлов, названных в восходящие временные метки (и профсоюз должен уважать это), а именно.

enter image description here

Я хочу союза первые 2 файла, затем с результатом 3-го файла, в результате 4-го файла, пока мы не объединили все файлы и только один окончательный большой файл остается.

Редактировать: Чтобы избежать путаницы, мне действительно нужен союз, а не конкатенация.

Как я могу это сделать? Спасибо большое!

+0

Вы, скорее всего, хотите использовать 'Concat' вместо' Union' – Alejandro

+0

Мне не нужен конкат, но логический союз. –

ответ

1

Неподтвержденный код ниже, но вы можете запрограммировать возвращаемое значение GetFiles.

IEnumerable<string> _currentInput = File.ReadLines(@"C:\http1.txt"); 

//skip 1 because you've read in the first file assuming it's ordered correctly 
foreach(var file in dinfo.GetFiles("*.txt").Skip(1)) 
{ 
    _currentInput = _currentInput.Union(File.ReadLines(file.FullName));  
} 

File.WriteAllLines(@"C:\union.txt", _currentInput.Cast<string>()); 

Если вы не уверены, первого файла, вы можете использовать обычный for цикл и пропустить объединение, если индекс 0.

+0

'var file = dinfo' должен ли он' in'? –

+0

Да, извините, я скопировал эту строку и забыл ее изменить. Я обновил ответ – keyboardP

1
public static void UnionFiles(string folderPath, string outputFilePath) 
{ 
    var union = Enumerable.Empty<string>(); 

    foreach (string filePath in Directory 
       .EnumerateFiles(folderPath, "*.txt") 
       .OrderBy(x => Path.GetFileNameWithoutExtension(x))) 
    { 
      union = union.Union(File.ReadAllLines(filePath)); 
    } 

    File.WriteAllLines(outputFilePath, union); 
} 

Обратите внимание, что это только основная идея , Например, он не выполняет проверку, чтобы пропускать чтение файлов, если/когда filePath == outputFilePath.

+0

, где он выполняет операцию объединения? –

+1

Редактирование моего ответа ... Спасибо за разъяснение. – blins

+0

Спасибо, отлично работает. –

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