逗号分隔值文件(读/写) - C#

时间:2009-10-03 09:05:45

标签: c# winforms csv

我已经对CSV文件感兴趣了几年了,但直到现在我都不需要使用它们,所以我对此很新。

我有一个应用程序存储有关用户在运行时创建的控件的信息。我计划使用CSV文件来存储这些信息,用户在将文件打开到我的程序时将在以后提取这些信息。

这些CSV文件将具有以下结构。比方说,例如,用户创建一个LinkLabel,为其分配一些文本,然后创建一个Label并为其分配一些文本。输出文件(CSV文件)如下所示:

CSVFile.csv


LinkLabel,This is LinkLabel's text,170,40
Label,This is Label's text,170,50

说明:


Control,Text,LocationX,LocationY
Control,Text,LocationX,LocationY

..所以,正如您所看到的,信息将始终相同。控制,文本,LocationX,LocationY ...

任何人都可以向我指出任何好的,易于理解的资源,我可以学习如何编写这样的文件吗?然后提取那些信息呢?

谢谢, 杰森。

6 个答案:

答案 0 :(得分:3)

我会避免使用csv文件,而是使用xml文件。这将为您提供更多灵活性,并为读者提供支持。

答案 1 :(得分:3)

我使用优秀且免费的FileHelpers库来处理CSV文件。这就是说我不太确定你真的应该使用CSV文件来做你想要做的事情。

Here您可以看到其他人如何实施类似功能。

答案 2 :(得分:2)

我想知道xaml是否不能免费完成你想要的大部分工作?但是如果你想要定制数据,我也会建议csv有它的一天,特别是当数据变得复杂时。有关完整的xml示例(为空格编写,请忽略格式化):

using System;
using System.Collections.Generic;
using System.Xml.Serialization;
public enum ControlType {
    Label, LinkLabel
}
[XmlRoot("controls")]
public class ControlWrapper {
    [XmlElement("control")] public List<ControlDto> Controls { get; set; }
    public ControlWrapper() {
        Controls = new List<ControlDto>();
    }
}
public class ControlDto {
    [XmlAttribute("type")] public ControlType Type { get; set; }
    [XmlAttribute("caption")] public string Caption { get; set; }
    [XmlAttribute("x")] public int LocationX { get; set; }
    [XmlAttribute("y")] public int LocationY { get; set; }
}
static class Program {
    static void Main() {
        var model = new ControlWrapper {
            Controls = {
                new ControlDto {
                    Type = ControlType.LinkLabel,
                    Caption = "This is LinkLabel's text",
                    LocationX = 170, LocationY = 40
                }, new  ControlDto {
                    Type = ControlType.Label,
                    Caption = "This is Label's text",
                    LocationX = 170, LocationY = 50
                }
            }
        };
        var ser = new XmlSerializer(typeof(ControlWrapper));
        ser.Serialize(Console.Out, model);
    }
}

这种方式主要处理对象模型,而不是序列化。实际上,修改上述内容以使用DataContractSerializer(对于WCF),protobuf-net(可移植二进制)等等将是微不足道的。

答案 3 :(得分:2)

作为XML的轻量级替代品,JSON为您提供了所有这些功能 你似乎在寻找。 JSON只是将对象序列化的一种方式 适合写入文件的字符串,供以后检索。

有一个活跃的JSON用户社区使用JSONSharp模块jsonsharp overview

关于为什么XML(可能)对您的健康有害的讨论,这里有一个非常有用的帖子:xml is bad for humans

返回有关CSV文件的问题, C#确实不包括任何用于编写和读取csv文件的解决方案,以及其他解决方案 已经提到过,你的第一个停靠点应该是众多库中的一个 如雨后春笋般涌现。

这就是你的结构在JSON中的样子:

["LinkLabel","This is LinkLabel's text",170,40]

答案 4 :(得分:0)

CSV文件的工作方式没有明确的标准,因此使用它们是有问题的。我建议使用XML,因为有一个明确的标准,你可以参考。

使CSV格式出现问题的一些因素:

  • 值可以包含换行符,因此您无法逐行读取文件。
  • 某些文件根本不是逗号分隔,而是以分号分隔。
  • 某些文件的线条参差不齐,即具有不同项目数的行。
  • 由于没有关于如何引用和转义值的规则,编写一个可以处理它解决的不同方式的解析器是很棘手的。

答案 5 :(得分:-2)

您的问题主要是关于如何写入文件。

Google并阅读了一些示例。

基本上,您正在考虑创建FileStream类的实例并写入磁盘。

我会发一个例子,但你最好先研究一下,然后重新发布一个更具体的问题。

写入CSV实际上只是写入文本文件。