【问题标题】:Tabular Data Exchange Format表格数据交换格式
【发布时间】:2013-05-05 10:34:16
【问题描述】:

背景:

我在 Asp.Net (C#) Web 应用程序中使用 CSV 进行数据交换格式。该文件通常用于批量上传请求。到目前为止,它运行良好,并且仍然有效。

然而,在研究文化的过程中,我们发现 csv 文件存在许多问题。最大的问题之一是分隔符由区域设置决定。当用户在 Excel 女士中编辑文件时会发生这种情况。例如,分隔符在美国是逗号,在欧洲某些地区是分号。

我已经搜索了一段时间,但没有找到任何灵丹妙药来处理这种情况。现在我想知道:

  1. 有什么好的方法来处理 CSV 文件中的分隔符定义吗?

  2. 有没有更好的数据交换格式,它是具有规范的不变文化:

    • 文件是纯文本文件(不是像 ms excel xlsx 这样的编码文件)
    • 这是不变的文化。我不是要处理小数点分隔符,但至少在分隔符处是不变的
    • Ms Excel 等电子表格应用程序支持它
    • (可选)可以被OleDb引擎读取

或者,如果有的话,是否有使用平面文件进行表格数据交换的好习惯?

更新:

到目前为止,这里是给定解决方案的优缺点总结。

  1. CSV(通常也用于表示分隔的平面文件):

    优点:

    • Excel 和 OleDb 等许多处理器都支持
    • 易于阅读
    • 使用记事本轻松操作

    缺点:

    • 使用 ms excel 编辑时存在分隔符文化问题
    • 需要转义或处理分隔符
  2. XML:

    优点:

    • Excel 和 xml 序列化程序等许多处理器都支持
    • 使用记事本轻松操作
    • 表示结构格式

    缺点:

    • 在excel中处理时需要额外处理
    • 使用标签在 xml 中产生更多内容
  3. json:

    优点:

    • 表示结构格式
    • 使用记事本轻松操作

    缺点:

    • Excel 等电子表格处理器本身不支持(需要确保)

【问题讨论】:

  • 这是用于 C# 还是 Java?还是两者兼而有之?
  • 这更多是为了处理数据类型。两者都受欢迎,但我希望有一个跨平台的解决方案。

标签: c# json xml csv format


【解决方案1】:

使用制表符作为分隔符是一种简单的切换,似乎大多数库都支持读取或写入,并且适用于 Excel。

【讨论】:

  • 我也在考虑用 TSV 代替。但是我想知道为什么 CSV 比 TSV 更可取? (因为有更多关于 TSV 的 CSV 讨论)
  • 我相信 CSV 经常被用作一个通用术语,不管实际使用的分隔符是什么。 (或行分隔符,或转义,或日期格式......)我用来读取或写入数据到文本文件的所有软件(电子表格、数据库、统计软件、库等)都同样满意.
  • 目前这是最有前途的解决方案,它简单且所需的要求最小。在决定之前会尝试使用它。
  • 我选择了这个作为接受的答案,因为 Excel 原生支持 Tab Delimited(甚至需要打开方式),可以使用 OleDb 处理,并且统一分隔
【解决方案2】:

XML 是一种比 CSV 更好的数据交换方法。

  1. 语法规则清晰。 XML 标准由在数据交换方面具有丰富经验的国际委员会制定并达成一致。 CSV 是一种特殊的交换格式,更多地由实践而非协议定义。
  2. 字符集规则清晰。 Unicode 及其各种编码也由国际委员会标准化。
  3. 从程序中发出 XML 非常简单,并且有大量库可以帮助解决棘手的问题,例如字符集。
  4. 读取XML也很简单。有大量的库可以帮助解决棘手的问题。 Microsoft Excel 和大多数商业数据库将读取和写入 XML 文件。

【讨论】:

  • 我尝试在 excel 中使用 xml 文件。但是看起来 excel 不本机支持 xml。它要求另存为,当我保存时,似乎 excel 生成了一些我不理解的代码。你有这方面的经验吗?
  • @Fendy - Excel 确实很好地处理 XML。
  • 是的,我仍在寻找在 excel 中做 XML 的好习惯。你有很好的来源吗?
  • 从 MS Excel 文件菜单中,选择打开... 转到包含您的 XML 文件的文件夹。选择它。
  • 用于从 MS Excel 生成 XML - office.microsoft.com/en-ca/excel-help/…
【解决方案3】:

您可以将整个文件读入string _var,然后应用String.Split() 函数来获取一个数组,指定您需要的任何分隔符集char。然后可以将数组插入到DB中,或者转换成DataTable / DataView,或者Range对应Excel Lib的对象(注:此方案涉及C#实现)

【讨论】:

  • 很抱歉,但这似乎无法完成。使用这种方法,我必须在解析逗号分隔时验证 "hello, what are you doing" 等字符串的分隔符
  • 那么,不要使用逗号分隔的文件:指定另一组分隔符。
  • 我将尝试使用自定义分隔符进行研究,例如竖线|。但是,我不确定 Excel 或 openOffice calc 等电子表格处理器的可用性。
  • 是的,它可能会起作用,但是你问的关于逗号的问题同样适用于这里:如果“|”怎么办是否包含在文本中?这是一个概念问题:如果允许分隔符成为文本的一部分,则 Split() 无法正常工作。您应该改用 xml,或者限制文本中的分隔符使用。
  • 好吧,在这种情况下,它应该用双引号将管道 (|) 字符括起来,但它需要正则表达式处理。另一件事,这种类型的分隔似乎在 excel 中不原生支持。
【解决方案4】:

CSV 的简单替代品可以是JSON - 这是一种非常简单的格式,在不同平台上有很多支持。

与 CSV 相比,您遇到的问题的主要好处是它没有这些问题 - 它不依赖于文化。

它也有缺点,但这些缺点与 CSV 共享(例如,没有数据类型可言)。

【讨论】:

  • 我还没用过 JSON。它适用于excel吗? (一会儿试试)
  • 我无法从这里打开它。 2-3 小时后(我会换个地方)我会去看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多