我写了一些邮件合并代码的一天,虽然它的作品我是一个用代码关闭.我想看看它看起来像在其他语言.
因此,对于输入,例程采用联系人列表
Jim,Smith,2681 Eagle Peak,,Bellevue,Washington,United States,98004
Erica,Johnson,2681 Eagle Peak,,Bellevue,Washington,United States,98004
Abraham,Johnson,2681 Eagle Peak,,Bellevue,Washington,United States,98004
Marge,Simpson,6388 Lake City Way,,Burnaby,British Columbia,Canada,V5A 3A6
Larry,Lyon,52560 Free Street,,Toronto,Ontario,Canada,M4B 1V7
Ted,Simpson,6388 Lake City Way,,Burnaby,British Columbia,Canada,V5A 3A6
Raoul,Simpson,6388 Lake City Way,,Burnaby,British Columbia,Canada,V5A 3A6
Run Code Online (Sandbox Code Playgroud)
然后它将具有相同地址和姓氏的行合并到一个记录中.假设行未排序).代码还应该足够灵活,以便可以按任何顺序提供字段(因此需要将字段索引作为参数).对于一个两口之家,它连接两个名字字段.对于三个或更多的家庭,名字设置为"the",姓氏设置为"surname family".
Erica and Abraham,Johnson,2681 Eagle Peak,,Bellevue,Washington,United States,98004
Larry,Lyon,52560 Free Street,,Toronto,Ontario,Canada,M4B 1V7
The,Simpson Family,6388 Lake City Way,,Burnaby,British Columbia,Canada,V5A 3A6
Jim,Smith,2681 Eagle Peak,,Bellevue,Washington,United States,98004
Run Code Online (Sandbox Code Playgroud)
我的C#实现是这样的:
var source = File.ReadAllLines(@"sample.csv").Select(l => l.Split(','));
var merged = HouseholdMerge(source, 0, 1, new[] {1, 2, 3, 4, 5});
public static IEnumerable<string[]> HouseholdMerge(IEnumerable<string[]> data, int fnIndex, int lnIndex, int[] groupIndexes)
{
Func<string[], string> groupby = fields => String.Join("", fields.Where((f, i) => groupIndexes.Contains(i)));
var groups = data.OrderBy(groupby).GroupBy(groupby);
foreach (var group in groups)
{
string[] result = group.First().ToArray();
if (group.Count() == 2)
{
result[fnIndex] += " and " + group.ElementAt(1)[fnIndex];
}
else if (group.Count() > 2)
{
result[fnIndex] = "The";
result[lnIndex] += " Family";
}
yield return result;
}
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢我如何做groupby委托.我想如果C#有一些方法将字符串表达式转换为委托.例如Func groupby = f =>"f [2] + f [3] + f [4] + f [5] + f [1];" 我觉得这样的事情可能在Lisp或Python中完成.我期待在其他语言中看到更好的实现.
编辑:社区维基复选框在哪里?一些mod请修复它.
姓名索引的代码为:a和b。输入数据来自 ARGF。
a,b=0,1\n[*$<].map{|i|i.strip.split ?,}.group_by{|i|i.rotate(a).drop 1}.map{|i,j|k,l,m=j\nk[a]+=' and '+l[a]if l\n(k[a]='The';k[b]+=' Family')if m\nputs k*','}\nRun Code Online (Sandbox Code Playgroud)\n