2013-07-10 3 views
2

У меня есть CSV-файл сНайти повторяющиеся элементы в CSV файл

FirstName LastName и ID колонки, Id является уникальным Колонка

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

Мне нужно получить два списка без использования DB, мне нужно прочитать его из файла в 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 

Что такое лучший способ решить эту проблему?

+0

Итак, с какой частью вы боретесь, читаете данные в списке или извлекаете данные в два списка? –

+0

Я боролся с лучшим решением, основанным на производительности –

ответ

1

прочитайте его в строке за строкой, рассматривайте как обычный текстовый файл.

разбора каждой строки с помощью string.split на «»

использовать один List для отслеживания идентификаторов, используя .Contains

объектов использования пользовательских данных структур для самих данных, и сделать два списка, один уникальный и один для дубликатов. (всего 3-х списков)

Если вы хотите использовать фактические примеры кода, пожалуйста, предоставьте список вещей, которые вы пробовали для меня, чтобы отлаживать вместе с тем, что такое ошибки.

5
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); 

Выход:

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

Dupes 
Chris, Webber, 1 
Chris, Webber, 6 
Chris, Ben, 2 
Chris, Ben, 5 
+0

oh phooy, все его работы для него. Как и ответ, мне никогда не приходило в голову использовать группировку на расколе – Nevyn

1
  1. Создать массив строк/Карта/ArrayList/Список, который будет содержать уникальный идентификаторы. --- Используйте то, что вам больше всего нравится.
  2. Прочтите файл в строке по строке
  3. Проверьте, является ли идентификатор уже частью массива Array/Map/ArrayList/List, который вы создали, а если нет, добавьте его в список массивов, если это не так.

Как вы добавляете его в список массивов, вы также можете добавить всю строку в набор данных, который вы можете использовать для хранения всех уникальных записей, которые у вас есть.

Смежные вопросы