2017-07-16 2 views
0

Ich habe zwei Textdateien.Gleichen Zeichenfolge Arrays von zwei Textdateien

Erste Textdatei (Test1.txt) einen Inhalt wie unten:

T1 
T2 
T3 
S1 
S2 
S3 

Zweite Textdatei (Test2.txt) einen Inhalt wie unten:

T2,James 
T3,Cindy 
S2,John 
S3,Martha 

gewünschte Ausgabe (Test3 .txt) ist unten:

T1 
James 
Cindy 
S1 
John 
Martha 

ich unten Code versucht habe, aber es scheint, dass die zweite Textdatei nicht in Betracht gezogen wird. Brauche deine Hilfe, um meinen Code zu korrigieren. Vielen Dank im Voraus.

string line; 
string DatabaseFullPath = @"D:\Test1.txt"; 
string line2; 
string DatabaseFullPath2 = @"D:\Test2.txt"; 

//write to new text file 
using (StreamWriter writetext = new StreamWriter(@"D:\Test3.txt")) 

//read second text file 
using (var file2 = new StreamReader(DatabaseFullPath2)) 
{ 
    line2 = file2.ReadLine(); 
    var ProjectInfo2 = line2.Split(','); 

    //read first text file 
    using (var file = new StreamReader(DatabaseFullPath)) 
    { 
     //loop on all lines of first text file 
     while ((line = file.ReadLine()) != null) 
     { 
     //compare lines with all the first column of second text file 
     if (line == ProjectInfo2[0]) 
     { 
      //put ProjectInfo2[1] on label 1. label 1 as a container 
      label1.Text = ProjectInfo2[1]; 
     } 
     else 
     { 
      //put line on label 1. label 1 as a container 
      label1.Text = line.Trim(); 
     } 

     //write all values of label1.Text 
     writetext.WriteLine(label1.Text.Trim()); 
    } 
    } 
} 

Stromausgang:

T1 
T2 
T3 
S1 
S2 
S3 
+0

Sie sollten Zeichenketten mit equals not == vergleichen, aber was ist Ihre aktuelle Ausgabe? –

+0

@Killer Death: Es scheint, dass 'Test1.txt' nachfolgende Leerzeichen enthält; Ich habe 'Trim() 's zum Code hinzugefügt, um ein solches Problem zu lösen (siehe meine Bearbeitung) –

+0

Hi Dmitry. Code funktioniert. Vielen Dank. Ich werde mehr über das Wörterbuch lernen. Gott segne. – thompogi

Antwort

0

Ich schlage vor, mit Wörterbuch um Sammlung des Schlüssels zu bauen/Wertepaare:

{ "T2", "James"} 
    { "T3", "Cindy"} 
    { "S2", "John"} 
    { "S3", "Martha"} 

Sie können es auf diese Weise implementieren:

using System.Linq; 
using System.IO; 

... 

Dictionary<string, string> CodeToName = File 
    .ReadLines("Test2.txt") 
    .Select(line => line.Split(',')) 
    .GroupBy(items => items[0].Trim()) 
    .ToDictionary(chunk => chunk.Key, 
       chunk => string.Join("; ", chunk.Select(item => item[1].Trim()))); 

ein Wörterbuch Nachdem Sie leicht Werte herausfinden können, entsprechen:

string name = null; 

File.WriteAllLines("Test3.txt", File 
    .ReadLines("Test1.txt") 
    .Select(line => CodeToName.TryGetValue(line.Trim(), out name) 
    ? name 
    : line)); 

Bei C# 7.0 und höher können Sie die später vereinfachen in

File.WriteAllLines("Test3.txt", File 
    .ReadLines("Test1.txt") 
    .Select(line => CodeToName.TryGetValue(line.Trim(), out var name) // out var syntax 
    ? name 
    : line)); 
+0

Hi Dmitry ersetzen. Vielen Dank für die Antwort. Ich habe den Code verwendet, aber ich habe das gleiche Ergebnis wie die aktuelle Ausgabe. T1, T2, T3, S1, S2, S3 – thompogi

0

Bei kleinen Dateien, die Sie diesen Ansatz verwenden:

var file1 = File.ReadAllLines(@"D:\Test1.txt"); 
var file2 = File.ReadAllLines(@"D:\Test2.txt"); 

var result = file1.Select(l1 => 
    file2.FirstOrDefault(l2 => l2.StartsWith($"{l1},"))?.Substring(l1.Length + 1) ?? l1); 
File.WriteAllLines(@"D:\Test3.txt", result); 
+0

Hallo Aleks. Vielen Dank für die Antwort. Ich habe den Code ausprobiert, aber ich bekomme das unerwartete Zeichen '$'. – thompogi

+0

@ThomasArriola ist eine String-Interpolation, eine C# 6-Funktion. Sie können '$" {l1}, "' mit 'l1 +", "' –

Verwandte Themen