如何使用 CSVHelper 将新列添加到 CSV 并将其写回另一个 CSV

How to add a new column to a CSV and write it back to another CSV using CSVHelper

我有一个 csv 文件,其中包含许多我想读取的列,然后将新列添加到 CSV 并将其写回。

我可以将其读入动态对象,但如何向其添加新列?

我正在使用 CSVHelper。

我不想定义一个 class 来读取 csv,因为列数非常多而且它可能会改变。

编辑 1

答案就是我要找的,它帮助我解决了问题。

不知道该向这个问题添加什么,因为它正确地解释了这个问题,有人回答了它(这个问题可能看起来很基本,但这不能成为关闭它的原因)

dynamic records = null;
using (var sReader = new StringReader("Id,Name\n1,Test"))
using (var csvReader = new CsvHelper.CsvReader(sReader, CultureInfo.InstalledUICulture))
{
    records = csvReader.GetRecords<dynamic>().ToList();
}

foreach (var record in records)
{
    record.NewColumn = "New Item";
}

using (var csvWriter = new CsvWriter(Console.Out, CultureInfo.InvariantCulture))
{
    csvWriter.WriteRecords(records);
}

如果需要动态添加列,可以这样添加。

foreach (var record in records)
{
    var expandoDict = record as IDictionary<string, object>;
    
    expandoDict.Add("NewColumn", "New Item");
}

注:

动态真的很慢。如果您只是向 CSV 中添加一个新字段,您可以直接读取和写入,而不需要将它们转换为任何类型的对象。也可以直接使用底层类。

void Main()
{
    var s = new StringBuilder();
    s.AppendLine("Id,Name");
    s.AppendLine("1,one");
    s.AppendLine("2,two");
    using (var reader = new StringReader(s.ToString()))
    using (var writer = new StringWriter())
    using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
    using (var serializer = new CsvSerializer(writer, CultureInfo.InvariantCulture))
    {
        var row = parser.Read();
        Array.Resize(ref row, row.Length + 1);
        row[row.Length - 1] = "Header Name";
        serializer.Write(row);
        serializer.WriteLine();
        while ((row = parser.Read()) != null)
        {
            Array.Resize(ref row, row.Length + 1);
            row[row.Length - 1] = "Field Value";
            serializer.Write(row);
            serializer.WriteLine();
        }
        
        writer.Flush();
        writer.ToString().Dump();
    }
}

此示例使用 LINQPad,这就是 .Dump() 方法的来源。