如何使用 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()
方法的来源。
我有一个 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()
方法的来源。