Коллекция с коллекцией в CSV, новая строка для каждой вложенной коллекции - PullRequest
0 голосов
/ 06 мая 2018

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

У некоторых студентов нет контактов, у некоторых - несколько.

Мне нужно 2 csv из этой коллекции студентов.Тот, который только для студентов, и тот, с которым у меня проблемы: CSV со строкой для каждого студента и связанного с ним контакта.Если у Бобби нет контактов, то у него 1 строка.Если у Суэзи 3 контакта, то 3 строки ее информации с контактными данными включены в строку.

Я пытаюсь использовать CsvHelper для этого, но не получаю ожидаемого результата.См. Ответ Джоша Клоуса здесь .

Я использую CSV для своих выборочных данных, один студент с 2 контактами, 2 студента с одним контактом каждый.И 1 студент без контактов.

Студенты:

StudentSisId    Name
111111          Betty
222222          Veronica
333333          Jughead
444444          Archie

Контакты:

StudentSisId    Relationship
111111          Mother
111111          Father
222222          Mother
444444          Father

Мой код: Классы:

public class Student
{
    public string StudentSisId { get; set; }
    public string Name { get; set; }
    public List<Contact> Contacts { get; set; }

}

public class Contact
{
    public string StudentSisId { get; set; }
    public string Relationship { get; set; }
}

Картография:

    public sealed class StudentClassMap : ClassMap<Student>
    {
        public StudentClassMap()
        {
            Map(m => m.StudentSisId);
            Map(m => m.Name);
            Map(m => m.Contacts).Index(2);
        }
    }

    public sealed class ContactClassMap : ClassMap<Contact>
    {
        public ContactClassMap()
        {
            Map(m => m.StudentSisId).Index(1);
            Map(m => m.Relationship).Index(2);
        }
    }

Код:

    private static void StudentsWithContacts()
    {
        var csvReader = new ReadCsvFile();

        List<Student> students = csvReader.GetDataCollection<Student>(@"c:\temp\studentsWithoutContacts.csv");
        List<Contact> contacts = csvReader.GetDataCollection<Contact>(@"c:\temp\contacts.csv");

        foreach (var student in students)
        {
            if (contacts.Any(x => x.StudentSisId == student.StudentSisId))
            {
                var studentContacts = contacts.Where(x => x.StudentSisId == student.StudentSisId).ToList();
                student.Contacts = new List<Contact>();
                student.Contacts.AddRange(studentContacts);
            }
        }

        using (var textWriter = File.CreateText(@"c:\temp\studentsWithContacts.csv"))
        using (var writer = new CsvWriter(textWriter))
        {
            writer.WriteHeader<Student>();
            writer.WriteRecords(students);
        }
     }

Это дает результаты (почему Бетти в заголовке?):

Имя StudentSisId 111111 Бетти 222222 Вероника
333333 Jughead
444444 Арчи

Я ожидаю:

StudentSisId        Name        Relationship
111111              Betty       Mother
111111              Betty       Father
222222              Veronica    Mother
333333              Jughead 
444444              Archie      Father

Я на правильном пути, или я неправильно понял инструмент?Это образец CsvHelper 3.2.Я могу обновить при необходимости.

1 Ответ

0 голосов
/ 07 мая 2018

Я не совсем знаком с csvhelper, чтобы справиться с вашими потребностями. Но с Cinchoo ETL / Linq вы можете выполнить слияние файлов, как показано ниже.

string csv1 = @"StudentSisId,Name
111111,Betty
222222,Veronica
333333,Jughead
444444,Archie";

string csv2 = @"StudentSisId,Relationship
111111,Mother
111111,Father
222222,Mother
444444,Father
";

StringBuilder sb = new StringBuilder();
using (var p1 = ChoCSVReader.LoadText(csv1)
    .WithFirstLineHeader()
    )
{
    using (var p2 = ChoCSVReader.LoadText(csv2)
        .WithFirstLineHeader()
        )
    {
        var j1 = from r1 in p1
                    join r2 in p2
                    on r1.StudentSisId equals r2.StudentSisId into p22
                    from r22 in p22.DefaultIfEmpty()
                select new { StudentSisId = r1.StudentSisId, Name = r1.Name, Relationship = r22 != null ? r22.Relationship : null };

        using (var w = new ChoCSVWriter(sb)
            .WithFirstLineHeader()
            )
            w.Write(j1);
    }
}

Console.WriteLine(sb.ToString());

Выход:

StudentSisId,Name,Relationship
111111,Betty,Mother
111111,Betty,Father
222222,Veronica,Mother
333333,Jughead,
444444,Archie,Father

Надеюсь, это поможет.

...