【问题标题】:Is there a way to interpret CSV cell splitting symbol in C#?有没有办法在 C# 中解释 CSV 单元格拆分符号?
【发布时间】:2019-01-31 21:11:02
【问题描述】:

当我开始保存 CSV 文件时,我注意到行并非总是由逗号 (,) 分隔,而是由分号 (;) 分隔。有没有办法在 C# 中记录它,无论它是分号还是逗号,它都应该将单元格分隔成不同的字符串。

我有一个包含 2 列的模板:名称、属性

名称非常简单,但属性可能包含多个以逗号分隔的值。

例子:

Name1; Property1, Property2, Property3
Name2; Property2, Property3
Name3; Property1

现在我需要了解的是:C# 是否有一个函数可以识别单元格分割符号,因为它可能是 (,) 或 (;)? 如果相同的数据用逗号表示:

Name1, Property1, Property2, Property3
Name2, Property2, Property3
Name3, Property1

我应该如何通过分离而不得到比我需要的更多的列,或者这是否可能?

【问题讨论】:

  • 您可以使用str.Split(',',';')。但是,您确定这些字段不包含两个分隔符之一吗?
  • 如果我们将您的问题概括为“如何拆分由多个字符组成的字符串”答案是基本的,Split 方法将一个 char 数组作为拆分字符,因此您可以使用任何您想要的。
  • string.Split(';', ','); 但是..Stop Rolling Your Own CSV Parser!
  • 只是为了详细说明Reniuz所说的,自己解析CSV文件是个坏主意!事实上,CSV 经常被误用,这使得它们在我看来是一种糟糕的格式。如果输出旨在供人使用,则 Open Office XML 电子表格 (.xlsx) 文件更合适。如果它的目的是在程序之间传递数据,那么 XML 或 JSON 是不错的选择。
  • 您要编写 CSV 以便 Excel 可以读取它吗?如果是这样,Excel 使用基于区域性的分隔符(例如 de-de 中的;)。您可以通过 System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator 获得相同的分隔符 请注意,您必须在字段的文本中转义该分隔符(或始终正确地转义该字段)。如果您想阅读它,您无法确定使用了哪个分隔符。

标签: c# csv


【解决方案1】:

String.Split 方法是您的朋友,它接受 params 应考虑拆分的字符数组。

string[] cells = line.Split(',',';')

如果您喜欢 StringSplitOptions 重载,您甚至可以排除空值。

【讨论】:

    【解决方案2】:

    您可以使用TextFieldParser 类来解析分隔文件。它有一个 delimiters 属性,您可以将其设置为文件的任何分隔符:

    TextFieldParser tfp = new TextFieldParser("C:\\File.txt");
    tfp.Delimiters = new[] {",", ";"};
    
    var fields = tfp.ReadFields();
    

    String.Split 相比,它的优势在于它只需设置一个标志即可处理带引号的字段。如果输入包含在引号中,它也会处理包含 CRLF 的输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      相关资源
      最近更新 更多