2017-05-15 46 views
-2

我想找到一種方法來比較2個文件中的某些文本,並且如果找到匹配項。C#比較匹配的2個文件子字符串

這裏是文件的例子;

'文件A'

EX1,德克薩斯州,24

EX2,邁阿密,78

EX3,亞特蘭大,56

EX4,NY,90

..

'文件B'

EX1,JHON,1110

EXA,DAVID,1060

EXB,CATHY,230

EX4,ROBERT,1200

...

使用我的2個示例文件,我想搜索它們並找到匹配(

ex1,TEXAS,24

&

EX4,NY,90

)??!

這裏是我的嘗試

private void button4_Click(object sender, EventArgs e) 
    { 
     string fileA, fileB, fileC; 
     fileA = textBox1.Text; 
     fileB = textBox2.Text; 
     fileC = "result.txt"; 

     string alphaFilePath = fileA; 

     List<string> alphaFileContent = new List<string>(); 
     using (FileStream fs = new FileStream(alphaFilePath, FileMode.Open)) 
     using (StreamReader rdr = new StreamReader(fs)) 
     { 
      while (!rdr.EndOfStream) 
      { 
      } 
     } 
     string betaFilePath = fileB; 

     StringBuilder sb = new StringBuilder(); 


     using (FileStream fs = new FileStream(betaFilePath, FileMode.Open)) 
     using (StreamReader rdr = new StreamReader(fs)) 
     { 
      while (!rdr.EndOfStream) 
      { 
       string[] betaFileLine = rdr.ReadLine().Split(Convert.ToChar(",")); 
       } 
     } 
     using (FileStream fs = new FileStream(fileC, FileMode.Create)){ 
    using (StreamWriter writer = new StreamWriter(fs)) 
    { 
     writer.Write(sb.ToString()); 
    } 
}    foreach (var item in alphaFileContent) 
       { 
        if (item.StartsWith(betaFileLine[0])) 
        { 
         sb.AppendLine(String.Format("{0}", betaFileLine[0])); 
        } 

       } 


    } 
+3

你試過什麼嗎? –

+2

Whe re是代表你遇到困難的代碼嗎? –

+0

S.Petrosov plz看看我的嘗試 –

回答

0

可以使用File.ReadAllLines獲取文件的所有行到一個數組:

var alphaFileContents = File.ReadAllLines(fileA); 

在代碼中,你正在檢查,看看哪些來自文件A StartWith的項目與從文件B到第一個逗號的項目具有相同的文本。我們可以通過使用string.Split(',')[0],其將字符串轉換成陣列上的逗號字符得到所有從FILEB前綴(行內容到第一個逗號),然後返回的第一項(索引0):

var betaFilePrefixes = File.ReadAllLines(fileB).Select(line => line.Split(',')[0]); 

現在,我們可以通過獲取fileA中的所有項目(以fileB中的項目開頭)來查找類似項目。下面的Where條款說,「在那裏任何alpha項目在betaFilePrefixes項目啓動:

var similarItems = alphaFileContents 
    .Where(alpha => betaFilePrefixes.Any(beta => alpha.StartsWith(beta))); 

然後,你可以寫所有的匹配行到results文件中使用File.WriteAllLines

File.WriteAllLines(fileC, similarItems); 

所以,把它放在一起,你可以這樣做:

private void button4_Click(object sender, EventArgs e) 
{ 
    var fileA = textBox1.Text; 
    var fileB = textBox2.Text; 
    var fileC = "result.txt"; 

    // Read the alpha file contents into a list 
    var alphaFileContents = File.ReadAllLines(fileA); 

    // Read each line of the beta file, and select the first part 
    // (up to the first comma) into a list 
    var betaFilePrefixes = File.ReadAllLines(fileB).Select(line => line.Split(',')[0]); 

    // Get all alpha lines that start with an item in the beta list 
    var similarItems = alphaFileContents 
     .Where(alpha => betaFilePrefixes.Any(alpha.StartsWith)); 

    // Write the lines to our result file 
    File.WriteAllLines(fileC, similarItems); 
} 
+0

謝謝你只是想寫類似的項目的所有行fileA,如何做到這一點? –

+1

這段代碼不是做你想做的嗎?如果不是,哪些不起作用? –

+0

它工作正是我想要的是獲得整個行的匹配,而不是File.WriteAllText(fileC,string.Join(「,」,similarItems)); ==> File.WriteAllText(fileC,string.Join(「,」,linefileA)); !!任何想法 ? –

0
var matches = File.ReadAllText(fileA).Split(',') 
    .Intersect(File.ReadAllText(fileB).Split(',')); 
+0

謝謝尤里我應用你的代碼並得到了system.linq.Enumerable + d__1'1 [system.String]我用它link this var path1 =「C:/ Users /.../ fileA.txt」; var path2 =「C:/ Users/... /fileB.txt」; –

+0

var matches = File.ReadAllText(path1).Split(',') .Intersect(File.ReadAllText(path2).Split(',')); –

+0

@ M.elsie如果你想打印結果你可以使用'string.Join(「,」,matches)' – CompuChip