2

我有一个 CSV 文件

FirstName LastName 和 ID 列,Id 是唯一列

Chris, Webber, 1 
Chris, Ben, 2
Chris, Dudley, 3
David, Floy, 4
Chris, Ben, 5 
Chris, Webber, 6

我需要在不使用数据库的情况下获取两个列表,我需要从 c# 中的文件中读取它并创建两个列表重复列表和 originalList。

重复列表包含所有重复项

Chris, Webber, 1
Chris, Webber, 6
Chris, Ben, 2
Chris, Ben, 5

原始列表具有唯一条目和第一次出现的重复条目。

Chris, Webber, 1
Chris, Ben, 2
Chris, Dudley, 3
David, Floy, 4

解决这个问题的最佳方法是什么?

4

3 回答 3

6
var lines = File.ReadLines("yourFile.ext");

// this assumes you can hold the whole file in memory

// uniqueness is defined by the first two columns
var grouped = lines.GroupBy(line => string.Join(", ", line.Split(',').Take(2)))
                   .ToArray();

// "unique entry and first occurrence of duplicate entry" -> first entry in group
var unique = grouped.Select(g => g.First());

var dupes = grouped.Where(g => g.Count() > 1)
                   .SelectMany(g => g);

Console.WriteLine("unique");
foreach (var name in unique)
    Console.WriteLine(name);

Console.WriteLine("\nDupes");
foreach (var name in dupes)
    Console.WriteLine(name);

输出:

独特的
克里斯,韦伯,1
克里斯,本,2
克里斯,达力,3
大卫,弗洛伊,4

骗子
克里斯,韦伯,1
克里斯,韦伯,6 岁
克里斯,本,2
克里斯,本,5 岁
于 2013-07-10T18:46:34.103 回答
1
  1. 创建一个保存唯一 ID 的字符串数组/映射/数组列表/列表。--- 使用您最舒适的工作方式。
  2. 逐行读取文件
  3. 检查 ID 是否已经是您创建的 Array/Map/ArrayList/List 的一部分 - 如果不是,请将其添加到数组列表中,如果是则不要。

当您将其添加到数组列表时,您还可以将整行添加到数据集中,您可以使用该数据集来存储您现在拥有的所有唯一记录。

于 2013-07-10T18:51:45.057 回答
1

逐行阅读,像纯文本文件一样对待。

string.split使用on ','解析每一行

使用一个List来跟踪 ID,使用 .Contains

对数据本身使用自定义数据对象结构,并制作两个列表,一个用于唯一条目,一个用于重复项。(共 3 个列表)

如果您想要实际的代码示例,请列出您尝试过的事情以供我调试以及错误是什么。

于 2013-07-10T18:36:45.183 回答