使用c#比较两个CSV文件的最佳方式

本文关键字:文件 CSV 最佳 方式 两个 比较 使用 | 更新日期: 2023-09-27 18:20:12

我希望每个单元格比较两个CSV文件。问题:假设驱动器上已经存在3个csv文件,我该如何完成此操作。这种方法是在第三个csv文件中显示比较结果的理想方式吗?

例如:

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

使用c#比较两个CSV文件的最佳方式

我认为最好的方法是读入一个DataTable并比较十个DataTables。网上有很多比较两个数据表的例子。使用以下代码将csv读取到数据表中

    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;
        }
    }
​

我会使用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的异步方法并逐行处理。