gpt4 book ai didi

c# - 将枚举写入 csv 文件

转载 作者:行者123 更新时间:2023-11-30 20:47:57 25 4
gpt4 key购买 nike

我确信它非常简单,但我正在努力弄清楚如何使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com