2017-10-11 1 views
1

두 개의 csv 파일을 비교하여 파일의 차이점을 인쇄하고 싶습니다. 현재 행을 제거하려면 아래 코드를 사용하십시오. 이 코드를 변경하여 두 개의 CSV 파일을 비교하거나 CSV 파일을 비교하는 더 좋은 방법이 있습니까?C에서 두 개의 csv 파일 비교 #

List<string> lines = new List<string>(); 
     using (StreamReader reader = new StreamReader(System.IO.File.OpenRead(path))) 
     { 
      string line; 
      while ((line = reader.ReadLine()) != null) 
      { 
       if (line.Contains(csvseperator)) 
       { 
        string[] split = line.Split(Convert.ToChar(scheidingsteken)); 

        if (split[selectedRow] == value) 
        { 

        } 
        else 
        { 
         line = string.Join(csvseperator, split); 
         lines.Add(line); 
        } 
       } 

      } 
     } 

     using (StreamWriter writer = new StreamWriter(path, false)) 
     { 
      foreach (string line in lines) 
       writer.WriteLine(line); 
     } 
    } 
+3

* 추가 ​​*, * 삭제 * 및 * 변경된 행을 찾으려면 * 편집 거리 * https://en.wikipedia.org/wiki/Edit_distance를 참조하십시오 –

+0

수 없습니다 그것을 사용하십시오. – Mylan

+2

왜 그렇게 슬퍼? 왜 그것을 사용할 수 없습니까? 가장 쉬운 편집 거리 (* Levenshtein * one)는 구현하기가 쉽습니다. https://en.wikipedia.org/wiki/Levenshtein_distance –

답변

0

당신은 단지 하나 개의 컬럼을 비교하려는 경우이 코드를 사용할 수 있습니다 : - 오픈 소스 라이브러리

여기

   List<string> lines = new List<string>(); 
    List<string> lines2 = new List<string>(); 



    try 
    { 
     StreamReader reader = new StreamReader(System.IO.File.OpenRead(pad)); 
     StreamReader read = new StreamReader(System.IO.File.OpenRead(pad2)); 

     string line; 
     string line2; 

     //With this you can change the cells you want to compair 
     int comp1 = 1; 
     int comp2 = 1; 

     while ((line = reader.ReadLine()) != null && (line2 = read.ReadLine()) != null) 
     {   
      string[] split = line.Split(Convert.ToChar(seperator)); 
      string[] split2 = line2.Split(Convert.ToChar(seperator)); 

      if (line.Contains(seperator) && line2.Contains(seperator)) 
      { 
       if (split[comp1] != split2[comp2]) 
       { 
        //It is not the same 
       } 
       else 
       { 
        //It is the same 

       } 
      } 
     } 
     reader.Dispose(); 
     read.Dispose(); 
    } 
    catch 
    { 

    } 
+0

매우 완벽하게 작동합니다. – Mylan

+0

이것은 각 행의 두 번째 열만 검사하고 하나의 CSV에 다른 행보다 많은 행이있는 경우 행을 무시합니다. –

+0

어떻게 해결할 수 있습니까? – Mylan

0

Cinchoo ETL을 사용하여 CSV 파일 사이의 차이점을 찾을 수있는 또 다른 방법입니다 아래 샘플 CSV 파일의 경우

sample1.csv

,
id,name 
1,Tom 
2,Mark 
3,Angie 

sample2.csv

id,name 
1,Tom 
2,Mark 
4,Lu 

코드는 모든 열

var input1 = new ChoCSVReader("sample1.csv").WithFirstLineHeader(); 
var input2 = new ChoCSVReader("sample2.csv").WithFirstLineHeader(); 

using (var output = new ChoCSVWriter("sampleDiff.csv").WithFirstLineHeader()) 
{ 
    output.Write(input1.OfType<ChoDynamicObject>().Except(input2.OfType<ChoDynamicObject>(), ChoDynamicObjectEqualityComparer.Default)); 
    output.Write(input2.OfType<ChoDynamicObject>().Except(input1.OfType<ChoDynamicObject>(), ChoDynamicObjectEqualityComparer.Default)); 
} 

에 의해

id,name 
3,Angie 
4,Lu 
sampleDiff.csv을 행 사이의 차이점을 발견하는 방법을 보여줍니다 아래 Cinchoo의 ETL을 사용하여

당신은 'ID'열을 기준으로 차이를 수행하려는 경우 (210),이 도움이

var input1 = new ChoCSVReader("sample1.csv").WithFirstLineHeader(); 
var input2 = new ChoCSVReader("sample2.csv").WithFirstLineHeader(); 

using (var output = new ChoCSVWriter("sampleDiff.csv").WithFirstLineHeader()) 
{ 
    output.Write(input1.OfType<ChoDynamicObject>().Except(input2.OfType<ChoDynamicObject>(), new ChoDynamicObjectEqualityComparer(new string[] { "id" }))); 
    output.Write(input2.OfType<ChoDynamicObject>().Except(input1.OfType<ChoDynamicObject>(), new ChoDynamicObjectEqualityComparer(new string[] { "id" }))); 
} 

희망.