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

时间:2015-11-02 18:01:09

标签: c# csv

我希望每个单元格比较两个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

2 个答案:

答案 0 :(得分:2)

我认为最好的方法是读入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;
        }
    }
​

答案 1 :(得分: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&#39;异步方法并逐行处理它们。