2017-02-14 1 views
-1

Первый текстовый файл выглядит следующим образом:Как я могу объединить два текстовых файла в один текстовый файл?

eu 
alps 
nl 
de 
sp 
fr 
gr 
it 
pl 
scan 

Второй текстовый файл выглядит следующим образом:

Europe 
Alps 
Benelux 
Germany 
Spain & Portugal 
France 
Greece 
Italy 
Poland 
Scandinavia 

Я хочу читать как текстовые файлы и создать новый текстовый файл в этом формате:

Code = eu 
Country = Europe 
Code = alps 
Country = Alps 
Code = nl 
Country = Benelux 

И так далее для остальных в этом формате.

То, что я сделал до сих пор, читает строки из каждого файла: но не уверен, как продолжить.

IEnumerable f1 = File.ReadLines(@"c:\temp\txt1"); 
IEnumerable f2 = File.ReadLines(@"c:\temp\txt2"); 
+1

Уверены ли вы входы, будет ли он всегда в одном порядке? –

+1

Почему этот вопрос был подавлен? Кажется, что по теме, это четко написано, и это показывает некоторые усилия со стороны автора. –

+0

@TannerSwett: Интересно то же самое, я видел некоторые проблемы с дерьмом, получая 6 очков, и некоторые хорошие вопросы сбиты вниз. Короче говоря, если у вас есть друзья на SE, независимо от того, какую кучу мусора вы пишете, вы получаете поддержку, а если нет, тогда приветствуйте downvotes. Мне на самом деле нравится этот вопрос, поэтому я тоже его поддержал, но время от времени или по голосу иногда не имеет никакого отношения к качеству, я видел ту же проблему и в Math SE. Я отказался от попытки задать вопрос, который вы задаете, просто сделайте немного, чтобы помочь. – Arjang

ответ

0

Я хотел бы сделать это:

string[] f1 = File.ReadAllLines(@"c:\temp\txt1"); 
string[] f2 = File.ReadAllLines(@"c:\temp\txt2"); 
string[] f3 = new string[Math.Min(f1.Length, f2.Length)]; 

for (int i = 0; i < f3.Length; i++) 
    f3[i] = "Code = " + f1[i] + "\nCountry = " + f2[i] +"\n"; 
File.WriteAllLines(@"c:\temp\txt3", f3); 
2

Zip соответствующие строки двух файлов, выберите код и страну строк и придавить строк массива перед записью в файл:

File.WriteAllLines(@"c:\temp\txt3", 
    f1.Zip(f2, (l1,l2) => new[] { $"Code = {l1}", $"Country = {l2}" }).SelectMany(a => a)); 

Дон» t забыть использовать IEnumerable<string> тип для f1 и f2. Вы также можете производить одну строку:

File.WriteAllLines(@"c:\temp\txt3", 
    f1.Zip(f2, (l1,l2) => $"Code = {l1}{Environment.NewLine}Country = {l2}")); 

Выход:

Code = eu 
Country = Europe 
Code = alps 
Country = Alps 
Code = nl 
Country = Benelux 
Code = de 
Country = Germany 
Code = sp 
Country = Spain & Portugal 
Code = fr 
Country = France 
Code = gr 
Country = Greece 
Code = it 
Country = Italy 
Code = pl 
Country = Poland 
Code = scan 
Country = Scandinavia 

= Try Me =

+0

'Zip' довольно изящный, но в этом случае я также думаю, что это может быть немного переборщить. Я думаю, что ответ не повезло проще и более точно. – Abion47

+1

Я считаю, что использование 'Zip' является хорошим решением здесь, так как оно также учитывает случай, когда элементы' IEnumerable' не совпадают в count. см. http://stackoverflow.com/a/5122767/3956100 – Niklas

+0

@ Повышение производительности Abion47 никогда не переполняется - zip перечисляет два итератора вместо того, чтобы сбрасывать все содержимое файла в массивы или списки. Вы можете исключить массив создания строк, но не zip –

1

Попробуйте это:

List<string> codeList = File.ReadLines(@"c:\temp\txt1").ToList(); 
List<string> nameList = File.ReadLines(@"c:\temp\txt2").ToList(); 

StringBuilder codeNameBuilder = new StringBuilder(); 

for (int i = 0; i < codeList.Count; i++) 
{ 
    codeNameBuilder.AppendFormat("Code = {0} \n Country = {1}", codeList[i], nameList[i]); 
} 

System.IO.File.WriteAllText(@"c:\temp\txtOutput.txt", codeNameBuilder.ToString()); 
0

Попробуйте это:

 string CodePath = Environment.CurrentDirectory + @"\Code.txt"; 
     List<string> Codes = File.ReadLines(CodePath).ToList(); 

     string CountryPath = Environment.CurrentDirectory + @"\Country.txt"; 
     List<string> Countries = File.ReadLines(CountryPath).ToList(); 

     string result = string.Empty; 
     int length = Math.Min(Codes.Count, Countries.Count); 
     for (int i = 0; i < length; i++) 
     { 
      result += "Code = " + Codes[i] + Environment.NewLine + "Country = " + Countries[i] + Environment.NewLine; 
     } 

     string OutPath = Environment.CurrentDirectory + @"\out.txt"; 
     File.WriteAllText(OutPath, result); 
0

Метод 1 (3 Массивов)

Создать два массива, а затем третий массив для хранения сцепленных строк:

var codes = File.ReadAllLines("Codes.txt"); 
var countries = File.ReadAllLines("Countries.txt"); 

var lines = new List<string>(codes.Length); 
for(int i = 0; i < codes.Length; i++) { 
    lines.Add($"Code = {codes[ i ]}" + Environment.NewLine + $"Country = {countries[ i ]}"); 
} 

File.WriteAllLines("Result.txt", lines); 

Метод 2 (2 Массивов тем меньше памяти)

Если вы не хотите использовать третий массив из-за потребления памяти, вы можете использовать один из массива, который у вас уже есть, и сохранить сцепленные строки в них:

var codes = File.ReadAllLines("Codes.txt"); 
var countries = File.ReadAllLines("Countries.txt"); 

for(int i = 0; i < codes.Length; i++) { 
    codes[i] = $"Code = {codes[ i ]}" + Environment.NewLine + $"Country = {countries[ i ]}"; 
} 

File.WriteAllLines("Result.txt", codes); 

Это самый лучший вариант, потому что это лучшее из обоих миров: меньше памяти, и только 3 операции ввода-вывода (2 читает, 1 запись).


Метод 3 (1 Массив так, меньшая память)

Эта техника будет считывать все страны в память, а затем прочитать одну строку из кодов файла в память, записать его в файл назначения, и затем прочитайте другую строку из файла кодов. Поэтому в любой момент времени в памяти есть только один код. Это достигается с помощью File.ReadLines.

var countries = File.ReadAllLines("Countries.txt"); 
int i = 0; 
File.WriteAllLines("Result2.txt", File.ReadLines("Codes.txt") 
    .Select(x => $"Code = {x}" + Environment.NewLine + $"Country = {countries[ i++ ]}")); 
Смежные вопросы