如何在平面文件(CSV,TSV等)中发现文本限定符?

时间:2013-05-28 12:12:23

标签: c# csv delimiter text-parsing

我们接收多种不同格式的文件 - CSV,TSV或使用更奇特的分隔符(| ,;等)的其他平面文件。这些文件也可以使用文本限定符,也可以使用各种格式(每个字段都有资格,只有那些包含限定符的字符,使用不同的字符',等等。)

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

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

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

任何人都可以提供更强大的选择吗?该问题的一个关键约束是我必须支持可以创建的许多不同类型的CSV中的任何一种文件。我的目标是在没有用户干预的情况下尽可能多地支持案例。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

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