误解CSV格式

时间:2017-07-17 17:41:13

标签: c# csv

首先,我想说:“我知道有XML / JSON / YAML格式,我知道它们是如何工作的”。但现在我面临着导出CSV格式文件的任务。

我在维基百科上阅读过CSV,在CSV主题上搜索了StackOverflow,但未找到答案。

正如我所读到的,这是未来Excel表格显示的流行格式。 好的,如果我有一个只有ValueType属性的简单类,那就没关系。

public class MyClass
{
    public int ID { get; set; }

    public string Name { get; set; }

    public string ToCsvString()
    {
        return string.Format("{0};{1}", ID, Name);
    }

    public static MyClass FromCsvString(string source)
    {
        var parts = source.Split(';');

        var id = int.Parse(parts[0]);
        var name = parts[1];

        return new MyClass()
        {
            ID = id,
            Name = name,
        };
    }
}

但是,如果我有一个更复杂的课程怎么办?例如,使用其他对象的List<>

public class MyClassWithList: MyClass
{
    public MyClassWithList()
    {
        ItemsList = new List<string>();
    }
    public List<string> ItemsList { get; set; }

    public string ToCsvString()
    {
        // How to format it for future according to CSV format?
        return string.Format("{0};{1}", base.ToCsvString(), ItemsList.ToString());
    }

    public static MyClassWithList FromCsvString(string source)
    {
        var parts = source.Split(';');

        var id = int.Parse(parts[0]);
        var name = parts[1];
        // How to get it back from CSV formatted string?
        var itemsList = parts[2];

        return new MyClassWithList()
            {
                ID = id,
                Name = name,
                ItemsList = new List<string>()
            };
    }
}

我应该如何将其序列化/反序列化为CSV? 最后一个问题是如何在课程A包含课程B个实例时如何做同样的事情?

1 个答案:

答案 0 :(得分:2)

首先,您必须压扁数据。

如果ClassA包含ClassB,那么您需要创建一个具有访问任何嵌套属性的属性的扁平POCO,例如: ClassB_PropertyA。

你实际上只有1个可变长度属性,它必须是最后一个属性,然后你可以在一个点代表一个列表属性之后有任何列。

其次,没有CSV Serliazation标准。有https://www.ietf.org/rfc/rfc4180.txt但这只涉及从字段中读取文本。像改变你的语言环境这样简单的东西可能会弄乱CSV库,因为在公共表示小数的文化中,分号将被切换为逗号。 Excel中还存在许多错误和边缘情况,导致对String的序列化存在问题。并且一些数据会自动转换为日期或时间。您需要确定打算使用哪个程序打开CSV并了解它如何处理CSV数据。

一旦你有一个平面POCO,那么CSV就是一个标题行,每个属性的名称后面跟着每个对象一行。有些图书馆可以帮助您解决这个问题。