【问题标题】:How to add a new column to a CSV and write it back to another CSV using CSVHelper [closed]如何将新列添加到 CSV 并使用 CSVHelper 将其写回另一个 CSV [关闭]
【发布时间】:2020-11-30 11:27:06
【问题描述】:

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

我可以将它读入一个动态对象,但是我怎样才能给它添加一个新列呢?

我正在使用 CSVHelper。

我不想定义一个类来读取 csv,因为列数非常多,而且可能会发生变化。

编辑 1

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

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

【问题讨论】:

    标签: c# csv dynamic csvhelper


    【解决方案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() 方法的来源。

    【讨论】:

    • 感谢@JoshClose 的留言。我没有想过直接写回写流。
    猜你喜欢
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多