我希望每个单元格比较两个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
答案 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;异步方法并逐行处理它们。