Объединение нескольких текстовых файлов txt построчно c редактированием значений
Необходимо объединить несколько файлов (3-10) в один построчно, при этом к с возможностью взаимодействия со строками.
2-3 файла еще можно обойти, но если их будет больше 10 цикл будет слишком большой. Подскажите, как лучше сделать.
using (StreamWriter writer = File.CreateText("10.txt"))
{
using (StreamReader sr1 = new StreamReader(path, Encoding.Default))
{
using (StreamReader sr2 = new StreamReader(path, Encoding.Default))
{
string line1 = null;
string line2 = null;
while ((line1 = sr1.ReadLine()) != null)
{
line1 = line1 + " sr1";
writer.WriteLine(line1);
line2 = sr2.ReadLine();
if (line2 != null)
{
line2 = line2 + " sr2";
writer.WriteLine(line2);
}
}
}
}
}
Пример:
Есть несколько файлов (может быть больше) txt c 50 строками в каждом
- первый.txt
- 1
- 1
- и так далее...
- второй.txt
- 2
- 2
- и так далее...
- третий.txt
- 3
- 3
- и так далее...
Объединить построчно в 1 файл txt, берем по 1 значению из каждого файла по порядку
- 1 (первая строка из первого)
- 2 (первая строка из второго)
- 3 (первая строка из третьего)
- 1 (вторая строка из первого)
- 2 (вторая строка из второго)
- 3 (второая строка из третьего)
- и так далее...
При этом в коде иметь доступ к дополнительному редактированию строк: К строкам из первого файла добить значение одной переменной (АА), К строкам из второго файла другой переменной (ББ) и так далее. Чтобы в итоге получилось
- 1АА
- 2ББ
- 3ВВ
- 1АА
- 2ББ
- 3ВВ
- и так далее...
Ответы (2 шт):
Схематично (no syntax):
open file1;
open file2;
...
open fileN;
open outfile;
do
flag=0;
tmp=readline(file1);
if (tmp != null)
outfile.write(tmp + "addition for file1");
flag=1;
tmp=readline(file2);
if (tmp != null)
outfile.write(tmp + "addition for file2");
flag=1;
...
tmp=readline(fileN);
if (tmp != null)
outfile.write(tmp + "addition for fileN");
flag=1;
while (flag=1);
close all;
var files = new string[] { "a.txt", "b.txt", "c.txt" };
var values = new string[] { "A", "B", "C" };
if (files.Length != values.Length)
throw new IndexOutOfRangeException("Arrays lengths do not match");
var enumerators = new List<IEnumerator<string>>();
foreach (var file in files)
enumerators.Add(File.ReadLines(file).GetEnumerator());
int counter;
do
{
counter = 0;
for (int i = 0; i < enumerators.Count; i++)
{
if (enumerators[i].MoveNext())
Console.WriteLine(enumerators[i].Current + values[i]);
else
counter++;
}
} while (counter < enumerators.Count);
foreach (var enumerator in enumerators)
enumerator.Dispose();
В массиве files - имена файлов.
В массиве values - значения, которые добавляем к строкам файлов.
Размеры этих массивов должны совпадать.
Открываем файлы на чтение и получаем перечислители (энумераторы), которые заносим в список.
Далее поочерёдно берём значения из энумераторов и присоединяем к ним соответсвующие значения из массива.
Счётчик counter содержит количество неактивных энумераторов, в которых закончились значения.
Количество строк в файлах может быть разным. Если оно во всех файлах одинаковое, то код можно упростить, избавившись от счётчика.
В конце освобождаем ресурсы.