作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我确信它非常简单,但我正在努力弄清楚如何使用 CSVHelper 将数组写入文件。
例如我有一个类
public class Test
{
public Test()
{
data = new float[]{0,1,2,3,4};
}
public float[] data{get;set;}
}
我希望将数据与每个数组值一起写入一个单独的单元格中。我在下面有一个自定义转换器,它提供一个包含所有值的单元格。
我做错了什么?
public class DataArrayConverter<T> : ITypeConverter
{
public string ConvertToString(TypeConverterOptions options, object value)
{
var data = (T[])value;
var s = string.Join(",", data);
}
public object ConvertFromString(TypeConverterOptions options, string text)
{
throw new NotImplementedException();
}
public bool CanConvertFrom(Type type)
{
return type == typeof(string);
}
public bool CanConvertTo(Type type)
{
return type == typeof(string);
}
}
最佳答案
为了进一步详细说明来自 Josh Close 的答案,在这里您需要做些什么才能在最新版本(以上任何内容)中编写任何 IEnumerable
(包括数组和通用列表) 3.0) 的 CsvHelper!
这里是被测类:
public class Test
{
public int[] Data { get; set; }
public Test()
{
Data = new int[] { 0, 1, 2, 3, 4 };
}
}
以及一个展示如何保存它的方法:
static void Main()
{
using (var writer = new StreamWriter("db.csv"))
using (var csv = new CsvWriter(writer))
{
var list = new List<Test>
{
new Test()
};
csv.Configuration.HasHeaderRecord = false;
csv.WriteRecords(list);
writer.Flush();
}
}
这里重要的配置是csv.Configuration.HasHeaderRecord = false;
。只有使用此配置,您才能看到 csv 文件中的数据。
可以在相关的 unit test cases 中找到更多详细信息。来自 CsvHelper。
如果您正在寻找一种解决方案来存储具有不同数量元素的 IEnumerable
类型的属性,以下示例可能会有所帮助:
using CsvHelper;
using CsvHelper.Configuration;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace CsvHelperSpike
{
class Program
{
static void Main(string[] args)
{
using (var writer = new StreamWriter("db.csv"))
using (var csv = new CsvWriter(writer))
{
csv.Configuration.Delimiter = ";";
var list = new List<AnotherTest>
{
new AnotherTest("Before String") { Tags = new List<string> { "One", "Two", "Three" }, After="After String" },
new AnotherTest("This is still before") {After="after again", Tags=new List<string>{ "Six", "seven","eight", "nine"} }
};
csv.Configuration.RegisterClassMap<TestIndexMap>();
csv.WriteRecords(list);
writer.Flush();
}
using(var reader = new StreamReader("db.csv"))
using(var csv = new CsvReader(reader))
{
csv.Configuration.IncludePrivateMembers = true;
csv.Configuration.RegisterClassMap<TestIndexMap>();
var result = csv.GetRecords<AnotherTest>().ToList();
}
}
private class AnotherTest
{
public string Before { get; private set; }
public string After { get; set; }
public List<string> Tags { get; set; }
public AnotherTest() { }
public AnotherTest(string before)
{
this.Before = before;
}
}
private sealed class TestIndexMap : ClassMap<AnotherTest>
{
public TestIndexMap()
{
Map(m => m.Before).Index(0);
Map(m => m.After).Index(1);
Map(m => m.Tags).Index(2);
}
}
}
}
通过使用 ClassMap
可以再次启用 HasHeaderRecord
(默认)。这里需要注意的是,只有当具有不同数量元素的集合是最后一个属性时,此解决方案才有效。否则集合需要具有固定数量的元素,并且 ClassMap
需要相应地进行调整。
此示例还展示了如何使用私有(private)集
处理属性。为此,重要的是使用 csv.Configuration.IncludePrivateMembers = true;
配置并在您的类中使用默认构造函数。
关于c# - 将枚举写入 csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25306120/
我是一名优秀的程序员,十分优秀!