csvHelper 在写入时对字段进行排序
csvHelper Sort field while writing
我正在尝试使用 CsvHelper 库将 CSV 流写入文件。一切都很好,但我被两件事困住了
- 如何向 csv 文件添加额外的列。附加列值将是一个常量,但仅在运行时才知道。
- 如果我一次写入一条记录以及一次写入所有记录,是否有一种方法可以在特定字段上对 CSV 文件进行排序
static void Main(string[] args)
{
var records = new List<MyTest>
{
new MyTest { Id = 1, Name = "John", Extra = "hello" },
new MyTest { Id = 2, Name = "Jack", Extra = "hi" },
};
using (var writer = new StreamWriter("C:\Users\machina\AppData\Local\Temp\file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.Context.RegisterClassMap<TestMap<MyTest>>();
csv.WriteRecords<MyTest>(records);
}
}
}
public interface IData
{
public int Id { get; set; }
public string Name { get; set; }
}
public abstract class AbTest : IData
{
public abstract int Id { get; set; }
public abstract string Name { get; set; }
public abstract string Extra { get; set; }
}
public class MyTest : AbTest
{
public override int Id { get; set; }
public override string Name { get; set; }
public override string Extra { get; set; }
}
public class TestMap<T> : ClassMap<MyTest>
{
public TestMap()
{
AutoMap(CultureInfo.InvariantCulture);
}
}
上面的工作是因为我已经准备好数据 records
但是我想要实现的是将 Extra
列值动态添加到我现有的 csv 数据流中,但没有它。
我还看到 DynamicPropertySort
在 csvconfiguration 下,想检查它是否可以在写入之前以任何方式用于对我的 CSV 流中的字段进行排序,即使它一次写入一条记录?
我是一个新手开发者,所以如果有更好的方法来实现这一点,请告诉我。
动态添加列的最简单方法可能是手动写出每一行。
DynamicPropertySort
仅用于对动态对象的列进行排序。您可以使用 linq OrderBy()
方法对特定字段进行排序。
static void Main(string[] args)
{
var records = new List<MyTest>
{
new MyTest { Id = 1, Name = "John", Extra = "hello" },
new MyTest { Id = 2, Name = "Jack", Extra = "hi" },
};
var extraField1 = 10;
var extraField2 = "Testing";
using (var writer = new StreamWriter("C:\Users\machina\AppData\Local\Temp\file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.Context.RegisterClassMap<TestMap>();
var orderedRecords = records.OrderBy(r => r.Name);
csv.WriteHeader<MyTest>();
csv.WriteField("ExtraField1");
csv.WriteField("ExtraField2");
csv.NextRecord();
foreach (var record in orderedRecords)
{
csv.WriteRecord(record);
csv.WriteField(extraField1);
csv.WriteField(extraField2);
csv.NextRecord();
}
}
}
我正在尝试使用 CsvHelper 库将 CSV 流写入文件。一切都很好,但我被两件事困住了
- 如何向 csv 文件添加额外的列。附加列值将是一个常量,但仅在运行时才知道。
- 如果我一次写入一条记录以及一次写入所有记录,是否有一种方法可以在特定字段上对 CSV 文件进行排序
static void Main(string[] args)
{
var records = new List<MyTest>
{
new MyTest { Id = 1, Name = "John", Extra = "hello" },
new MyTest { Id = 2, Name = "Jack", Extra = "hi" },
};
using (var writer = new StreamWriter("C:\Users\machina\AppData\Local\Temp\file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.Context.RegisterClassMap<TestMap<MyTest>>();
csv.WriteRecords<MyTest>(records);
}
}
}
public interface IData
{
public int Id { get; set; }
public string Name { get; set; }
}
public abstract class AbTest : IData
{
public abstract int Id { get; set; }
public abstract string Name { get; set; }
public abstract string Extra { get; set; }
}
public class MyTest : AbTest
{
public override int Id { get; set; }
public override string Name { get; set; }
public override string Extra { get; set; }
}
public class TestMap<T> : ClassMap<MyTest>
{
public TestMap()
{
AutoMap(CultureInfo.InvariantCulture);
}
}
上面的工作是因为我已经准备好数据 records
但是我想要实现的是将 Extra
列值动态添加到我现有的 csv 数据流中,但没有它。
我还看到 DynamicPropertySort
在 csvconfiguration 下,想检查它是否可以在写入之前以任何方式用于对我的 CSV 流中的字段进行排序,即使它一次写入一条记录?
我是一个新手开发者,所以如果有更好的方法来实现这一点,请告诉我。
动态添加列的最简单方法可能是手动写出每一行。
DynamicPropertySort
仅用于对动态对象的列进行排序。您可以使用 linqOrderBy()
方法对特定字段进行排序。
static void Main(string[] args)
{
var records = new List<MyTest>
{
new MyTest { Id = 1, Name = "John", Extra = "hello" },
new MyTest { Id = 2, Name = "Jack", Extra = "hi" },
};
var extraField1 = 10;
var extraField2 = "Testing";
using (var writer = new StreamWriter("C:\Users\machina\AppData\Local\Temp\file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.Context.RegisterClassMap<TestMap>();
var orderedRecords = records.OrderBy(r => r.Name);
csv.WriteHeader<MyTest>();
csv.WriteField("ExtraField1");
csv.WriteField("ExtraField2");
csv.NextRecord();
foreach (var record in orderedRecords)
{
csv.WriteRecord(record);
csv.WriteField(extraField1);
csv.WriteField(extraField2);
csv.NextRecord();
}
}
}