【问题标题】:How do I discover text qualifiers in a flat file (CSV, TSV etc)?如何在平面文件(CSV、TSV 等)中发现文本限定符?
【发布时间】:2013-05-23 09:46:09
【问题描述】:

我们接收多种不同格式的文件 - CSV、TSV 或其他使用更多特殊分隔符(|、; 等)的平面文件。这些文件也可以使用文本限定符,同样采用多种格式(每个字段都符合条件,而仅包含限定符的字段,使用不同的字符','等)。

我编写了一个工具,该工具能够使用频率分析技术成功识别文件中的分隔符,这与此处提到的 Python 嗅探器类不同:How should I detect which delimiter is used in a text file?

我现在正在尝试扩展该工具以支持文本限定文件。这里的困难在于频率分析不足以识别文本限定符,因为许多形式的 CSV 只会用文本限定符包装包含分隔符的字段,因此例如一个有 10k 行的文件可能整个文本限定符只有 2 次出现文件。

我目前的方法是扫描文件以查找分隔符-文本限定符对(例如 ,' 和 ',),然后将它们与其他潜在对(例如 ," 和 ",)进行比较并选择最常出现的。

谁能提供更强大的替代方案?这个问题的一个关键限制是我必须支持可以创建的许多不同风格的 CSV 文件中的任何一种。我的目标是在没有用户干预的情况下支持尽可能多的案例。

【问题讨论】:

    标签: c# csv delimiter text-parsing


    【解决方案1】:

    您可以尝试使用正则表达式进行一些模式匹配。由于您已经知道分隔符,您可以尝试使用常见限定符列表,例如 "'。如果这些失败,您可以尝试解析列对齐不正确的行,以获取与模式匹配并产生预期列对齐的输入。

    var delimiter = ",";
    var qualifiers = new[] { "\"", "'" };
    var input = @"""Hello, World"", Hello, World";
    var pattern = @"(?<={1}).*{0}.*(?={1})";
    
    foreach(var p in qualifiers.Select(q => string.Format(pattern, delimiter, q)))
    {
        Regex.Match(input, p);
    }
    

    【讨论】:

    • 谢谢,我会进一步调查。我认为正则表达式可能是要走的路,但是因为有几种情况需要考虑,所以很难想出正确的表达方式——如果第一个字段是文本限定的,那么它将是“...”,例如,而不是 , “...”,这被翻转为一个文本限定的最终字段。不过,您的回答可能正是我需要的跳板。
    【解决方案2】:

    您可以使用正则表达式提取带有索引的特殊字符吗?在索引上你可以得到序列。

    【讨论】:

      猜你喜欢
      • 2014-10-16
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 2019-10-11
      • 2015-09-05
      • 2016-11-09
      • 2013-01-26
      • 2016-03-28
      相关资源
      最近更新 更多