使用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
我认为最好的方法是读入一个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的异步方法并逐行处理。