如何解决如何在不使用类 a 映射的情况下控制 CsvHelper 写入 CSV 文件头的顺序?
public byte[] BuildProductsFile(List<object> records)
{
var firstRow = records.FirstOrDefault();
var columnHeaders = ((IDictionary<string,object>) firstRow).Keys.ToList();
using var memoryStream = new MemoryStream();
using (var streamWriter = new StreamWriter(memoryStream))
{
using var csvWriter = new CsvWriter(streamWriter);
csvWriter.WriteRecords(records);
}
return memoryStream.ToArray();
}
当我执行 WriteRecords 时,它将标题名称更改为我不想要的字母顺序,因为之后我的行对应于不正确的标题。我无法使用类来指定标题名称,因为它们会因用户想要获取的不同表而有所不同。
var columnHeaders = ((IDictionary<string,object>) firstRow).Keys.ToList();
或者,有没有办法禁用按字母顺序排列的订单标题?
解决方法
您必须在 10.0.0 和 12.0.0 之间使用 CsvHelper
版本。在这两个版本之间,CsvWriter.WriteRecords()
将按字母顺序编写 ExpandoObject
属性。升级到更高版本(或降级到早期版本)以消除这种行为。
有关确认,请参阅change log:
10.0.0
特点:
- 按升序编写 ExpandoObject 和 IDynamicMetaObjectProvider 对象属性,以确保属性创建的顺序无关紧要。
12.0.0
功能
- 添加了用于在写入时对动态对象属性进行排序的配置选项。默认为属性值设置顺序。
重大变化
- 添加了
IComparer<string> IWriterConfiguration.DynamicPropertySort
。 - 添加了
IComparer<string> Configuration.DynamicPropertySort
。
有关发生这种情况的原因的讨论,请参阅 When writing dynamic object order of property assignments is significant #1037。
可以在此处找到 CsvHelper
在版本 11 中失败的演示:demo #1。
可以在此处找到 CsvHelper
在最新版本 26 中按需要工作的演示:demo #2。
如果您确实需要按照字符串序列指定的顺序编写 CSV 列,则可以使用上面提到的 CsvConfiguration.DynamicPropertySort
:
class OrderComparer : IComparer<string>
{
// Note this comparer assumes that all strings to be compared are present in the incoming collection of strings,and will throw an exception if not.
// If this is not desired,enhance as required.
readonly Dictionary<string,int> orders;
public OrderComparer(IEnumerable<string> orderedHeaders) => orders = orderedHeaders.Select((i,s) => (i,s)).ToDictionary(p => p.i,p => p.s);
public int Compare(string x,string y) => orders[x] - orders[y];
}
public static byte[] BuildProductsFile(List<object> records,IEnumerable<string> orderedHeaders) =>
BuildProductsFile(records,new OrderComparer(orderedHeaders));
public static byte[] BuildProductsFile(List<object> records,IComparer<string> dynamicPropertySort)
{
using var memoryStream = new MemoryStream();
using (var streamWriter = new StreamWriter(memoryStream))
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
DynamicPropertySort = dynamicPropertySort,};
using var csvWriter = new CsvWriter(streamWriter,config);
csvWriter.WriteRecords(records);
}
return memoryStream.ToArray();
}
此处 DynamicPropertySort
的演示:demo #3。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。