2015-11-02 4 views
0

Я ищу, чтобы сравнить две ячейки файлов CSV на ячейку. Вопрос: Как я могу это сделать, полагая, что 3 csv-файла уже существуют на диске. Будет ли этот метод идеальным способом представления результатов сравнения на третий CSV-файл?Лучший способ сравнить два CSV-файла с помощью C#?

Например:

Sheet1 
     A  B  C  D 
    1 Ann  300  700  1000  

    2 Zoe  2  4  6 

    3 Ian  100  200  300 

    4 Zak  90  90  180 

Sheet2 
     A  B  C  D 
    1 Ann  400  700  1100  

    2 Zoe  2  4  6 

    3 Ian  100  100  200 

    4 Zen  90  90  180 

Results 
     A  B  C  D 
    1 O  X  O  X 

    2 O  O  O  O 

    3 O  O  X  X 

    4 X  O  O  O 
+1

Вы не ищете «лучший способ», но «каким-либо образом это работает», верно? Что вы пробовали? Что хорошо или плохо о вашем предложении, на какой вопрос вы на самом деле пытаетесь получить ответ? – CodeCaster

+0

Попробуйте найти [здесь] (http://stackoverflow.com/questions/5240218/efficiently-identify-changed-fields-in-csv-files-using-c-sharp) и [здесь] (http: // stackoverflow. com/questions/3458355/c-sharp-comparing-two-csv-files-and-giving-a-output) – Icemanind

+0

Для файла # 1 есть строки пользовательских данных (строка1 = имя, фамилия, социальное обеспечение, строка2 - имя, фамилия, социальный). Для файла № 2 аналогичные данные упорядочены одинаково, и моя цель - проверить, соответствует ли все в строке №1 строки 1 строке строки # 2. –

ответ

2

Я думаю, что лучший способ для чтения в DataTable и десять сравнить DataTables. Существует множество примеров сравнения двух типов данных в Интернете. Используйте приведенный ниже код для чтения CSV в DataTable

public class CSVReader 
    { 

     public DataSet ReadCSVFile(string fullPath, bool headerRow) 
     { 

      string path = fullPath.Substring(0, fullPath.LastIndexOf("\\") + 1); 
      string filename = fullPath.Substring(fullPath.LastIndexOf("\\") + 1); 
      DataSet ds = new DataSet(); 

      try 
      { 
       if (File.Exists(fullPath)) 
       { 
        string ConStr = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}" + ";Extended Properties=\"Text;HDR={1};FMT=Delimited\\\"", path, headerRow ? "Yes" : "No"); 
        string SQL = string.Format("SELECT * FROM {0}", filename); 
        OleDbDataAdapter adapter = new OleDbDataAdapter(SQL, ConStr); 
        adapter.Fill(ds, "TextFile"); 
        ds.Tables[0].TableName = "Table1"; 
       } 
       foreach (DataColumn col in ds.Tables["Table1"].Columns) 
       { 
        col.ColumnName = col.ColumnName.Replace(" ", "_"); 
       } 
      } 

      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      return ds; 
     } 
    } 
​ 
0

Я хотел бы использовать FileHelpers. Определите классы, как это:

[DelimitedRecord(",")] 
public class data { 
    public string A; 
    public int B; 
    public int C; 
    public int D; 
} 
[DelimitedRecord(",")] 
public class resultdata { 
    public string A {get;set;} 
    public string B {get;set;} 
    public string C {get;set;} 
    public string D {get;set;} 
} 

Тогда ваш код становится:

var engine=new FileHelperEngine<data>(); 
var r1=engine.ReadFile("1.csv"); 
var r2=engine.ReadFile("2.csv"); 
var r3=r1.zip(r2,(f1,f2)=>new resultdata{ 
    A=f1.A==f2.A?"X":"O", 
    B=f1.B==f2.B?"X":"O", 
    C=f1.C==f2.C?"X":"O", 
    D=f1.D==f2.D?"X":"O"}); 
var engine2=new FileHelperEngine<resultdata>(); 
engine2.WriteFile("3.csv",r3); 

Если вам нужно сделать очень и очень большие файлы (которые вы не можете обработать в памяти), вы можете использовать FileHelpers' Асинхронные методы и работайте над ними по строкам.

Смежные вопросы