2017-02-14 4 views
-1

Erste Textdatei sieht wie folgt aus:Wie kann ich zwei Textdateien zu einer Textdatei kombinieren?

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

möchte ich beide Text-Dateien lesen und eine neue Textdatei in diesem Format erstellen:

eu 
alps 
nl 
de 
sp 
fr 
gr 
it 
pl 
scan 

Zweite Textdatei sieht wie folgt aus

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

Und so weiter für den Rest in diesem Format.

Was ich bisher gemacht habe, liest die Zeilen aus jeder Datei: aber nicht sicher, wie es weiter geht.

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

Sind Sie sicher über die Eingänge, wird es immer in der gleichen Reihenfolge? –

+1

Warum wurde diese Frage abgelehnt? Es scheint auf dem Thema zu sein, es ist klar geschrieben, und es zeigt eine gewisse Anstrengung seitens des Autors. –

+0

@TannerSwett: Ich habe mich auch gefragt, ich habe ein paar Mistprobleme gesehen, 6 Punkte bekommen und ein paar gute Fragen bekommen. Kurz gesagt, wenn Sie Freunde in SE haben, egal was für ein Müllberg Sie schreiben, werden Sie upvoted, und wenn nicht, dann hallo downvotes. Ich mag diese Frage wirklich, also habe ich sie auch hochgestuft, aber die Abstimmung nach oben oder unten hat manchmal nichts mit Qualität zu tun, ich habe das gleiche Problem auch auf Math SE gesehen. Ich habe es aufgegeben, die Frage zu stellen, die Sie stellen, tun Sie einfach mein kleines bisschen, um zu helfen. – Arjang

Antwort

0

Ich würde dies tun:

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 entsprechenden Zeilen aus zwei Dateien, wählen Sie Code und Land Strings und Strings Array glätten, bevor sie das Schreiben in Datei:

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

Don‘ t vergessen zu verwenden IEnumerable<string> typ für f1 und f2. Sie können auch einzelne Zeichenfolge produzieren:

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

Ausgang:

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' ist ziemlich elegant, aber in diesem Fall denke ich auch, dass es ein bisschen übertrieben sein könnte. Ich denke, die Antwort von un-glücklich ist einfacher und mehr auf den Punkt. – Abion47

+1

Ich glaube, dass die Verwendung von 'Zip' hier eine gute Lösung ist, da es auch den Fall berücksichtigt, wenn die 'IEnumerable'-Elemente nicht übereinstimmen. http://stackoverflow.com/a/5122767/3956100 – Niklas

+0

@ Abion47 Leistungssteigerung ist nie übertrieben - zip zählt zwei Iteratoren auf, anstatt alle Dateiinhalte in Arrays oder Listen zu speichern. Sie können Arrays von Strings erstellen, aber nicht zippen –

1

Versuchen Sie folgendes:

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
diese

Versuchen:

 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

Methode 1 (3 Arrays)

Erstellen zwei Arrays und dann ein drittes Array die verketteten Zeichenketten zu speichern:

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); 

Methode 2 (2 Arrays so weniger Speicher)

Wenn Sie das dritte Array aufgrund des Speicherverbrauchs nicht verwenden möchten, können Sie eines der bereits vorhandenen Arrays verwenden und das Array speichern verketteten Strings in ihnen:

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); 

Dies ist die beste Option, weil es das Beste aus beiden Welten ist: weniger Speicher und nur 3 IO-Operationen (2 liest, 1 schreiben).


Methode 3 (1 Array so weniger Speicher)

Diese Technik wird alle Länder in den Speicher gelesen und dann eine Zeile gelesen aus die Codes in den Speicher-Datei, schreiben Sie es in die Zieldatei und Lesen Sie dann eine andere Zeile aus der Codedatei. Zu jedem Zeitpunkt gibt es nur einen Code im Speicher. Dies wird unter Verwendung von File.ReadLines erreicht.

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++ ]}")); 
Verwandte Themen