C # Объединение двух или более текстовых файлов рядом - PullRequest
0 голосов
/ 29 мая 2018
using (StreamWriter writer = File.CreateText(FinishedFile))
{
    int lineNum = 0;
    while (lineNum < FilesLineCount.Min())
    {
        for (int i = 0; i <= FilesToMerge.Count() - 1; i++)
        {
            if (i != FilesToMerge.Count() - 1)
            {
                var CurrentFile = File.ReadLines(FilesToMerge[i]).Skip(lineNum).Take(1);
                string CurrentLine = string.Join("", CurrentFile);
                writer.Write(CurrentLine + ",");
            }
            else
            {
                var CurrentFile = File.ReadLines(FilesToMerge[i]).Skip(lineNum).Take(1);
                string CurrentLine = string.Join("", CurrentFile);
                writer.Write(CurrentLine + "\n");
            }
        }
        lineNum++;
    }
}

В настоящее время я делаю это слишком медленно.Я объединяю файлы, каждая из которых имеет длину 50 000 строк и различное количество данных.

для примера: Файл 11234

Файл 24321

Мне нужно, чтобы это стало третьим файлом.Файл 31,42,33,24,1PS Пользователь может выбрать любое количество файлов из любого места.Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вот еще один подход - эта реализация хранит в памяти только один набор строк из каждого файла одновременно, что значительно снижает нагрузку на память (если это проблема).

public static void MergeFiles(string output, params string[] inputs)
{
    var files = inputs.Select(File.ReadLines).Select(iter => iter.GetEnumerator()).ToArray();
    StringBuilder line = new StringBuilder();
    bool any;

    using (var outFile = File.CreateText(output))
    {
        do
        {
            line.Clear();
            any = false;

            foreach (var iter in files)
            {
                if (!iter.MoveNext())
                    continue;

                if (line.Length != 0)
                    line.Append(", ");

                line.Append(iter.Current);
                any = true;
            }

            if (any)
                outFile.WriteLine(line.ToString());
        }
        while (any);
    }

    foreach (var iter in files)
    {
        iter.Dispose();
    }
}

Это также обрабатывает файлы разныхдлина.

0 голосов
/ 29 мая 2018

Вы подходите медленно из-за Skip и Take в циклах.

Вы можете использовать словарь для сбора всех строк индекса строки:

string[] allFileLocationsToMerge = { "filepath1", "filepath2", "..." };
var mergedLists = new Dictionary<int, List<string>>();
foreach (string file in allFileLocationsToMerge)
{
    string[] allLines = File.ReadAllLines(file);
    for (int lineIndex = 0; lineIndex < allLines.Length; lineIndex++)
    {
        bool indexKnown = mergedLists.TryGetValue(lineIndex, out List<string> allLinesAtIndex);
        if (!indexKnown)
            allLinesAtIndex = new List<string>();
        allLinesAtIndex.Add(allLines[lineIndex]);
        mergedLists[lineIndex] = allLinesAtIndex;
    }
}

IEnumerable<string> mergeLines = mergedLists.Values.Select(list => string.Join(",", list));
File.WriteAllLines("targetPath", mergeLines);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...