【问题标题】:Comma Separated Value Files (Read/Write) - C#逗号分隔值文件(读/写) - C#
【发布时间】:2009-10-03 09:05:44
【问题描述】:

几年来我一直对 CSV 文件非常感兴趣,但直到现在我才需要使用它们,所以我对此很陌生。

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

这些 CSV 文件将具有以下结构。例如,假设用户创建一个 LinkLabel,为其分配一些文本,然后创建一个标签并为其分配一些文本。输出文件(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...

谁能指出我可以学习如何编写这样一个文件的任何好的、易于理解的资源?然后也提取这些信息?

谢谢, 杰森。

【问题讨论】:

    标签: c# winforms csv


    【解决方案1】:

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

    【讨论】:

    • 你能推荐一些好的网站来开始学习 C# 的 XML 吗?我确实考虑过这一点,但我找不到任何有用的网站。
    • +1 根据经验,如果文件必须可以通过其他应用程序访问,我会使用 XML,否则使用二进制序列化。
    • 通常您甚至不必知道如何在 .NET 中读取或写入 XML - 您只需将对象或对象列表传递给 XMLWriter,它就会为您序列化它(如果可能的,即只包含可序列化的类型)。要读回它,请将文件路径传递给 XMLReader 并取回一个可以转换为原始对象的对象。它几乎有点太容易用于配置了。此外,使用 %appdata% (stackoverflow.com/questions/867485 ) 将其存储在 Windows 系统上 - 不要将其存储在应用程序目录中^^
    【解决方案2】:

    我使用优秀且免费的 FileHelpers 库来处理 CSV 文件。也就是说,我不太确定您是否真的应该使用 CSV 文件来执行您正在尝试做的事情。

    Here你可以看到其他人是如何实现类似功能的。

    【讨论】:

      【解决方案3】:

      我想知道 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(便携式二进制文件)等将是微不足道的。

      【讨论】:

        【解决方案4】:

        作为比 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]
        

        【讨论】:

          【解决方案5】:

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

          导致 CSV 格式存在问题的一些因素:

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

          【讨论】:

          • 也许不是标准,但有 RFC 4180 tools.ietf.org/html/rfc4180 en.wikipedia.org/wiki/Comma-separated_values 但我同意 CSV 经常存在问题。
          • @Jonas:这是一个很好的概述,当我写一个 CSV 解析器时它会很方便,但是它还没有发布......请注意 MS Excel 生成的 CSV 文件根据这些定义(即锯齿线)被破坏。
          【解决方案6】:

          您的问题基本上是关于如何写入文件。

          谷歌并阅读一些示例。

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

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

          写入 CSV 本质上只是写入文本文件。

          【讨论】:

          • 从我在网上找到的 CSV 文件的示例代码来看,它与编写普通的旧文本文件有很大不同,而且似乎还有很多。
          • CSV 文件只是一个普通的旧文本文件,因此名称为逗号分隔值文件。
          • 是的,它是一个“纯”文本文件,但生成“coorect”csv 背后的逻辑稍微复杂一些。 excel 很好地涵盖了单元格格式和包含“拆分”分隔符的值。所以不,这不像编写自己的文本文件那么容易。
          猜你喜欢
          • 2023-03-02
          • 1970-01-01
          • 2013-03-25
          • 1970-01-01
          • 1970-01-01
          • 2014-12-14
          • 1970-01-01
          • 1970-01-01
          • 2021-05-24
          相关资源
          最近更新 更多