您可以根据要求使用 linq 组合相关行。
比方说,您定义了对象来表示每个 CSV 行,如下所示(为了澄清,仅提及几列)
public class Item
{
public string szItemId { get; set; }
public string szName { get; set; }
public string lRetailStoreID { get; set; }
public string szDesc { get; set; }
}
现在使用 Linq 投影查询合并它们的困难部分如下
var recs = p.Where(r => !String.IsNullOrEmpty(r.szItemId)).GroupBy(r => r.szItemId)
.Select(g => new {
szItemId = g.Key,
szName = g.Where(i1 => !String.IsNullOrEmpty(i1.szName)).Select(i1 => i1.szName).FirstOrDefault(),
lRetailStoreID = g.Where(i1 => !String.IsNullOrEmpty(i1.lRetailStoreID)).Select(i1 => i1.lRetailStoreID).FirstOrDefault(),
szDesc = g.Where(i1 => !String.IsNullOrEmpty(i1.szDesc)).Select(i1 => i1.szDesc).FirstOrDefault()
});
上述查询为您提供了输入 csv 文件中的合并行。现在您可以迭代并将它们写入 CSV。
希望这会有所帮助。
使用Cinchoo ETL - 一个开源框架,您可以通过如下几行代码快速读写CSV文件
using (var p = new ChoCSVReader("mergeinput.csv").WithFirstLineHeader())
{
var recs = p.Where(r => !String.IsNullOrEmpty(r.szItemId)).GroupBy(r => r.szItemId)
.Select(g => new {
szItemId = g.Key,
szName = g.Where(i1 => !String.IsNullOrEmpty(i1.szName)).Select(i1 => i1.szName).FirstOrDefault(),
lRetailStoreID = g.Where(i1 => !String.IsNullOrEmpty(i1.lRetailStoreID)).Select(i1 => i1.lRetailStoreID).FirstOrDefault(),
szDesc = g.Where(i1 => !String.IsNullOrEmpty(i1.szDesc)).Select(i1 => i1.szDesc).FirstOrDefault()
});
using (var o = new ChoCSVWriter("mergeoutput.csv").WithFirstLineHeader())
{
o.Write(recs);
}
}
披露:我是这个库的作者