Search code examples
c#csvhelper

c# csvhelper writing complex data


I have the following object structure and trying to write to csv using csvhelper. but the filenames column in not getting added.

public class ClusterData
{
    public IEnumerable<string> FileName { get; set; }

    public int? ClusterNumber { get; set; }

    public string TopTerm { get; set; }
}


    using (var writer = new StreamWriter(@"C:\Clean.csv"))
    {
        var csv = new CsvWriter(writer);
        csv.WriteHeader<ClusterData>();
        foreach (var item in dataToCsv)
        {
            foreach (var filename in item.FileName)
            {
                csv.WriteField(filename);
                csv.WriteField(item.ClusterNumber);
                csv.WriteField(item.TopTerm);
                csv.NextRecord();
            }
        }
        writer.Flush();
    }

how to achieve with this?i want the outer loop to be repeated once and inner loop to be repeated for each item in filename.

Thanks


Solution

  • Extract the desired data and then use the writer to send it to file

    using (var writer = new StreamWriter(@"C:\Clean.csv")) {
        var data = new List<ClusterData>();
    
        //...assuming data is poulated
    
        var dataToCsv = data.SelectMany(item => item.FileName.Select(filename => new {
            FileName = filename,
            ClusterNumber = item.ClusterNumber,
            TopTerm = item.TopTerm
        }));
    
        var csv = new CsvWriter(writer);
        csv.WriteRecords(dataToCsv);
    }
    

    A linq query is used to construct the desired object format for each file name in the data.

    The data is then converted to CSV as it normally would using a CsvWriter